基于上一篇的翻译文章,我参考了一下别人的思路,尝试写了一下customed membershipprovider类。该代码适合于Login控件,LoginName控件,LoginStatus控件,CreateUserWizard控件,LoginView控件,ChangePassword控件。
代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
/// <summary>
/// AccessMembershipProvider类
/// </summary>
public class AccessMembershipProvider:MembershipProvider
{
private string connStr;//数据库连接字符串
private bool _requiresQuestionAndAnswer; //是否需要用户解答密码问题
private int _minRequiredPasswordLength;//取得密码所需的最小长度
public AccessMembershipProvider()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public override int MinRequiredPasswordLength
{
get { return _minRequiredPasswordLength; }
}
public override bool RequiresQuestionAndAnswer
{
get { return _requiresQuestionAndAnswer; }
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
if (config["requiresQuestionAndAnswer"] == "true")
{
_requiresQuestionAndAnswer = true;
}
else
{
_requiresQuestionAndAnswer = false;
}
int.TryParse(config["minRequiredPasswordLength"], out _minRequiredPasswordLength);
connStr = config["connectionString"];
base.Initialize(name, config);
}
public override bool ValidateUser(string username, string password)
{
OleDbConnection conn = new OleDbConnection(connStr);
try
{
conn.Open();
string sql = "select * from Membership where username=@username and password=@password";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", password);
OleDbDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
conn.Close();
return true;
}
else
{
conn.Close();
return false;
}
}
catch
{
if(conn.State == ConnectionState.Open)
conn.Close();
return false;
}
}
public override string ApplicationName
{
get
{
throw new Exception("The method or operation is not implemented.");
}
set
{
throw new Exception("The method or operation is not implemented.");
}
}
public override bool ChangePassword(string username, string oldPassword, string newPassword)
{
if (!ValidateUser(username, oldPassword))
return false;
ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true);
OnValidatingPassword(args);
if (args.Cancel)
if (args.FailureInformation != null)
throw args.FailureInformation;
else
throw new MembershipPasswordException("Change password canceled due to new password validation failure.");
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
string sql = "update [Membership] set [password]=@password where [username]=@username";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.Add("@password", OleDbType.VarChar, 255).Value = newPassword;
cmd.Parameters.Add("@username", OleDbType.VarChar, 255).Value = username;
int rowsAffected = 0;
try
{
rowsAffected = cmd.ExecuteNonQuery();
}
catch
{
throw new Exception("Changepassword Exception.");
}
finally
{
conn.Close();
}
if (rowsAffected > 0)
{
return true;
}
return false;
}
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
if (!ValidateUser(username, password))
return false;
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
string sql = "update [Membership] set [passwordQuestion]=@passwordQuestion and [passwordAnswer]=@passwordAnswer where [username]=@username";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.Add("@username", OleDbType.VarChar, 255).Value = username;
cmd.Parameters.Add("@passwordQuestion", OleDbType.VarChar, 255).Value = newPasswordQuestion;
cmd.Parameters.Add("@passwordAnswer", OleDbType.VarChar, 255).Value = newPasswordAnswer;
int rowsAffected = 0;
try
{
rowsAffected = cmd.ExecuteNonQuery();
}
catch
{
throw new ApplicationException("ChangePasswordQuestionAndAnswer Exception.");
}
finally
{
conn.Close();
}
if (rowsAffected > 0)
{
return true;
}
return false;
}
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
OleDbConnection conn = new OleDbConnection(connStr);
try
{
conn.Open();
string sql = "insert into Membership([username],[password],[Email],[passwordQuestion],[passwordAnswer]) values(@username,@password,@email,@passwordQuestion,@passwordAnswer)";
OleDbCommand command = new OleDbCommand(sql, conn);
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@password", password);
command.Parameters.AddWithValue("@email", email);
command.Parameters.AddWithValue("@passwordQuestion", passwordQuestion);
command.Parameters.AddWithValue("@passwordAnswer", passwordAnswer);
command.ExecuteNonQuery();
conn.Close();
MembershipUser user = new MembershipUser("AccessMembershipProvider", username, providerUserKey, email, passwordQuestion, "", isApproved, true, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
status = MembershipCreateStatus.Success;
return user;
}
catch
{
if (conn.State == ConnectionState.Open)
conn.Close();
status = MembershipCreateStatus.ProviderError;
return null;
}
}
public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
throw new Exception("The method or operation is not implemented.");
}
public override bool EnablePasswordReset
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override bool EnablePasswordRetrieval
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new Exception("The method or operation is not implemented.");
}
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new Exception("The method or operation is not implemented.");
}
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
{
throw new Exception("The method or operation is not implemented.");
}
public override int GetNumberOfUsersOnline()
{
throw new Exception("The method or operation is not implemented.");
}
public override string GetPassword(string username, string answer)
{
if (!EnablePasswordRetrieval)
{
throw new ApplicationException("Password Retrieval Not Enable.");
}
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
string sql = "select * from [Membership] where [username]=@username";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.Add("@username", OleDbType.VarChar, 255).Value = username;
string password = null;
string passwordAnswer = null;
OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow);
try
{
if (dr.HasRows)
{
dr.Read();
password = dr.GetString(1);
passwordAnswer = dr.GetString(4);
}
}
catch
{
throw new ApplicationException("GetPassword Exception.");
}
finally
{
if (dr != null)
{
dr.Close();
}
conn.Close();
}
return password;
}
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
{
throw new Exception("The method or operation is not implemented.");
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
string sql="select * from [Membership] where username=@username";
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.Parameters.Add("@username", OleDbType.VarChar, 255).Value = username;
OleDbDataReader dr = cmd.ExecuteReader();
MembershipUser user = null;
try
{
if (dr.HasRows)
{
dr.Read();//
user = GetUserFromReader(dr);
/*if (userIsOnline)
{
do something here......
}*/
}
}
catch
{
throw new ApplicationException("GetUser Exception!");
}
finally
{
if (dr != null)
{
dr.Close();
}
conn.Close();
}
return user;
}
public override string GetUserNameByEmail(string email)
{
throw new Exception("The method or operation is not implemented.");
}
public override int MaxInvalidPasswordAttempts
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override int MinRequiredNonAlphanumericCharacters
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override int PasswordAttemptWindow
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override MembershipPasswordFormat PasswordFormat
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override string PasswordStrengthRegularExpression
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override bool RequiresUniqueEmail
{
get { throw new Exception("The method or operation is not implemented."); }
}
public override string ResetPassword(string username, string answer)
{
throw new Exception("The method or operation is not implemented.");
}
public override bool UnlockUser(string userName)
{
throw new Exception("The method or operation is not implemented.");
}
public override void UpdateUser(MembershipUser user)
{
throw new Exception("The method or operation is not implemented.");
}
//通过OleDataReader获取当前的行,并测试MembershipUser的值,通过调用实现MembershipUser.GetUser方法.。
private MembershipUser GetUserFromReader(OleDbDataReader reader)
{
string username = reader.GetString(0);
string email = reader.GetString(2);
string passwordQuestion =null;
if (reader.GetValue(3) != DBNull.Value)
{
passwordQuestion = reader.GetString(3);
}
MembershipUser user = new MembershipUser("AccessMembershipProvider", username, "", email, passwordQuestion, "", true, true, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
return user;
}
}
评论