实践ASP.NET MVC--加入自定义MembershipProvider成员管理

新建一个 ASP.NET MVC后,默认已经实现了用户注册登录一系列功能,今天尝试自定义MembershipProvider,结合SQLServer进行用户管理,记录一下
环境:Windows7 IIS7 VisualStudio2008 AspNetMVC2_Preview1_VS2008
1.新建ASP.NET MVC 2 Web Applicaton(具体办法参加google或者http://asp.net/mvc)
2.修改Web.Config增加自定义MemberShipProvider
ContractedBlock.gif ExpandedBlockStart.gif Code
<membership defaultProvider="DbMembershipProvider"> <providers> <clear/> <!--<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/>--> <add name="DbMembershipProvider" type="MVCDemo.Helper.DbMembershipProvider,MVCDemo" passwordFormat="Hashed" connectionStringName="MVCDemoConnectionString" applicationName="/"/> </providers> </membership>
注意添加defaultProvider,不然会出错:)
3.添加类MVCDemo.Helper.DbMembershipProvider
4.结合linq to sql实现DbMembershipProvider
新建linq to sql类,并在服务器资源管理器中将表拖至设计面板
重写DbMembershipProvider的各个方法
ContractedBlock.gif ExpandedBlockStart.gif MVCDemo
using System;
using System.Collections.Specialized;
using System.Configuration;
using System.Configuration.Provider;
using System.Data;
using System.Data.Common;
using System.Web.Security;
using System.Text;
using System.Linq;
using System.Security.Cryptography;

namespace MvcDemo.Helper
{
    
/// <summary>
    
/// Generic Db Membership Provider
    
/// </summary>
    public class DbMembershipProvider : MembershipProvider
     {
        
private string applicationName;
        
private MembershipPasswordFormat passwordFormat;
        
private DataClassesDemoDataContext db = new DataClassesDemoDataContext();
        
/// <summary>
        
/// Initializes the provider
        
/// </summary>
        
/// <param name="name">Configuration name</param>
        
/// <param name="config">Configuration settings</param>
        public override void Initialize(string name, NameValueCollection config)
         {
            
if (config == null)
             {
                
throw new ArgumentNullException("config");
             }

            
if (String.IsNullOrEmpty(name))
             {
                 name
= "DbMembershipProvider";
             }
             applicationName
= config["applicationName"];
             passwordFormat
= MembershipPasswordFormat.Hashed;

            
base.Initialize(name, config);

         }

        
/// <summary>
        
/// Add new user to database
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="password"></param>
        
/// <param name="email"></param>
        
/// <param name="passwordQuestion"></param>
        
/// <param name="passwordAnswer"></param>
        
/// <param name="isApproved"></param>
        
/// <param name="providerUserKey"></param>
        
/// <param name="status"></param>
        
/// <returns></returns>
        public override MembershipUser CreateUser(string username, string password, string email,
                                                  
string passwordQuestion, string passwordAnswer, bool isApproved,
                                                  
object providerUserKey, out MembershipCreateStatus status)
         {
            
//添加重复性判断
            if (ExistUserName(username))
             {
                 status
= MembershipCreateStatus.DuplicateUserName;
                
return null;
             }
             MVCUser mvcuser
= new MVCUser()
             {
                 EmailAddress
= email,
                 Password
= HashPassword(password),
                 UserName
= username
             };
             db.MVCUser.InsertOnSubmit(mvcuser);
             db.SubmitChanges();

             status
= MembershipCreateStatus.Success;

            
return GetMembershipUser(username, email);
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="password"></param>
        
/// <param name="newPasswordQuestion"></param>
        
/// <param name="newPasswordAnswer"></param>
        
/// <returns></returns>
        public override bool ChangePasswordQuestionAndAnswer(string username, string password,
                                                             
string newPasswordQuestion, string newPasswordAnswer)
         {
            
throw new NotImplementedException();
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="answer"></param>
        
/// <returns></returns>
        public override string GetPassword(string username, string answer)
         {
            
throw new NotImplementedException();
         }
        
/// <summary>
        
/// check if username duplicate
        
/// </summary>
        
/// <param name="username"></param>
        
/// <returns></returns>
        public bool ExistUserName(string username)
         {
             username
= username.Trim();
             var a
= from muser in db.MVCUser where muser.UserName == username select muser;
            
if (a == null || a.Count() == 0)
                
return false;
            
return true;
         }
        
/// <summary>
        
/// get MVCUser by username
        
/// </summary>
        
/// <param name="username"></param>
        
/// <returns></returns>
        public MVCUser GetUserByUserName(string username)
         {
             username
= username.Trim();
             var a
= from muser in db.MVCUser where muser.UserName == username select muser;
            
if (a == null || a.Count() == 0)
                
return null;
            
return a.First();
         }
        
/// <summary>
        
/// Change the password if the old password matches what is stored
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="oldPassword"></param>
        
/// <param name="newPassword"></param>
        
/// <returns></returns>
        public override bool ChangePassword(string username, string oldPassword, string newPassword)
         {
             MVCUser mvcuser
= GetUserByUserName(username);
            
if (mvcuser == null)
                
return false;
            
if (mvcuser.Password == HashPassword(oldPassword))
             {
                 mvcuser.Password
= HashPassword(newPassword);
                 db.SubmitChanges();
                
return true;
             }
            
return false;
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="answer"></param>
        
/// <returns></returns>
        public override string ResetPassword(string username, string answer)
         {
            
throw new NotImplementedException();
         }

        
/// <summary>
        
/// Update User Data (not password)
        
/// </summary>
        
/// <param name="user"></param>
        public override void UpdateUser(MembershipUser user)
         {
             var a
= from muser in db.MVCUser where muser.UserName == user.UserName select muser;
            
if (a.Count() == 0)
                
return;
             MVCUser mvcuser
= a.First();
             mvcuser.EmailAddress
= user.Email;
             db.SubmitChanges();
            
//string connString = ConfigurationManager.ConnectionStrings[connStringName].ConnectionString;
            
//string providerName = ConfigurationManager.ConnectionStrings[connStringName].ProviderName;
            
//DbProviderFactory provider = DbProviderFactories.GetFactory(providerName);

            
//using (DbConnection conn = provider.CreateConnection())
            
//{
            
//    conn.ConnectionString = connString;

            
//    using (DbCommand cmd = conn.CreateCommand())
            
//    {
            
//        cmd.CommandText = "UPDATE " + tablePrefix + "Users SET emailAddress = " + parmPrefix + "email WHERE userName = " + parmPrefix + "name";
            
//        cmd.CommandType = CommandType.Text;

            
//        conn.Open();

            
//        DbParameter dpName = provider.CreateParameter();
            
//        dpName.ParameterName = parmPrefix + "name";
            
//        dpName.Value = user.UserName;
            
//        cmd.Parameters.Add(dpName);
            
//        DbParameter dpEmail = provider.CreateParameter();
            
//        dpEmail.ParameterName = parmPrefix + "email";
            
//        dpEmail.Value = user.Email;
            
//        cmd.Parameters.Add(dpEmail);

            
//        cmd.ExecuteNonQuery();
            
//    }
            
//}
        }

        
/// <summary>
        
/// Check username and password
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="password"></param>
        
/// <returns></returns>
        public override bool ValidateUser(string username, string password)
         {

             var a
= from muser in db.MVCUser where muser.UserName == username && muser.Password == HashPassword(password) select muser;
            
if (a == null || a.Count() == 0)
                
return false;
            
return true;
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        
/// <param name="userName"></param>
        
/// <returns></returns>
        public override bool UnlockUser(string userName)
         {
            
throw new NotImplementedException();
         }

        
/// <summary>
        
/// Get User by providerUserKey
        
/// </summary>
        
/// <param name="providerUserKey"></param>
        
/// <param name="userIsOnline"></param>
        
/// <returns></returns>
        public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
         {
            
return GetUser(providerUserKey.ToString(), userIsOnline);
         }

        
/// <summary>
        
/// Get User by username
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="userIsOnline"></param>
        
/// <returns></returns>
        public override MembershipUser GetUser(string username, bool userIsOnline)
         {

             MVCUser mvcuser
= GetUserByUserName(username);
            
if (mvcuser == null)
                
return null;
            
return GetMembershipUser(username, mvcuser.EmailAddress);
         }

        
/// <summary>
        
/// Retrieve UserName for given email
        
/// </summary>
        
/// <param name="email"></param>
        
/// <returns></returns>
        public override string GetUserNameByEmail(string email)
         {
             var a
= from muser in db.MVCUser where muser.EmailAddress == email select muser;

            
if (a.Count() == 0)
                
return null;
            
return a.First().UserName;
         }

        
/// <summary>
        
/// Delete user from database
        
/// </summary>
        
/// <param name="username"></param>
        
/// <param name="deleteAllRelatedData"></param>
        
/// <returns></returns>
        public override bool DeleteUser(string username, bool deleteAllRelatedData)
         {
             var a
= from muser in db.MVCUser where muser.UserName == username select muser;
            
if (a.Count() == 0)
                
return false;
             db.MVCUser.DeleteOnSubmit(a.First());
             db.SubmitChanges();
            
return true;
         }

        
/// <summary>
        
/// Return all users in MembershipUserCollection
        
/// </summary>
        
/// <param name="pageIndex"></param>
        
/// <param name="pageSize"></param>
        
/// <param name="totalRecords"></param>
        
/// <returns></returns>
        public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
         {
             MembershipUserCollection users
= new MembershipUserCollection();
             var a
= from muser in db.MVCUser select muser;
            
foreach (MVCUser user in a)
             {
                 users.Add(GetMembershipUser(user.UserName, user.EmailAddress));
             }
             totalRecords
= users.Count;
            
return users;
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        
/// <returns></returns>
        public override int GetNumberOfUsersOnline()
         {
            
throw new NotImplementedException();
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        
/// <param name="usernameToMatch"></param>
        
/// <param name="pageIndex"></param>
        
/// <param name="pageSize"></param>
        
/// <param name="totalRecords"></param>
        
/// <returns></returns>
        public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize,
                                                                 
out int totalRecords)
         {
            
throw new NotImplementedException();
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        
/// <param name="emailToMatch"></param>
        
/// <param name="pageIndex"></param>
        
/// <param name="pageSize"></param>
        
/// <param name="totalRecords"></param>
        
/// <returns></returns>
        public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize,
                                                                  
out int totalRecords)
         {
            
throw new NotImplementedException();
         }

        
/// <summary>
        
/// Can password be retrieved via email?
        
/// </summary>
        public override bool EnablePasswordRetrieval
         {
            
get { return false; }
         }

        
/// <summary>
        
/// Hardcoded to false
        
/// </summary>
        public override bool EnablePasswordReset
         {
            
get { return false; }
         }

        
/// <summary>
        
/// Hardcoded to false
        
/// </summary>
        public override bool RequiresQuestionAndAnswer
         {
            
get { return false; }
         }

        
/// <summary>
        
/// Returns the application name as set in the web.config
        
/// otherwise returns BlogEngine.  Set will throw an error.
        
/// </summary>
        public override string ApplicationName
         {
            
get { return applicationName; }
            
set { throw new NotImplementedException(); }
         }

        
/// <summary>
        
/// Hardcoded to 5
        
/// </summary>
        public override int MaxInvalidPasswordAttempts
         {
            
get { return 5; }
         }

        
/// <summary>
        
/// Not implemented
        
/// </summary>
        public override int PasswordAttemptWindow
         {
            
get { throw new NotImplementedException(); }
         }

        
/// <summary>
        
/// Hardcoded to false
        
/// </summary>
        public override bool RequiresUniqueEmail
         {
            
get { return false; }
         }

        
/// <summary>
        
/// Password format (Clear or Hashed)
        
/// </summary>
        public override MembershipPasswordFormat PasswordFormat
         {
            
get { return passwordFormat; }
         }

        
/// <summary>
        
/// Hardcoded to 4
        
/// </summary>
        public override int MinRequiredPasswordLength
         {
            
get { return 4; }
         }

        
/// <summary>
        
/// Hardcoded to 0
        
/// </summary>
        public override int MinRequiredNonAlphanumericCharacters
         {
            
get { return 0; }
         }

        
/// <summary>
        
/// Not Implemented
        
/// </summary>
        public override string PasswordStrengthRegularExpression
         {
            
get { throw new NotImplementedException(); }
         }

        
private MembershipUser GetMembershipUser(string userName, string email)
         {
             MembershipUser user
= new MembershipUser(
                                    
"DbMembershipProvider",                       // Provider name
                                    userName,                   // Username
                                    userName,                   // providerUserKey
                                    email,                      // Email
                                    String.Empty,               // passwordQuestion
                                    String.Empty,               // Comment
                                    true,                       // isApproved
                                    false,                      // isLockedOut
                                    DateTime.Now,               // creationDate
                                    DateTime.Now,                  // lastLoginDate
                                    DateTime.Now,               // lastActivityDate
                                    DateTime.Now,               // lastPasswordChangedDate
                                    new DateTime(1980, 1, 1)    // lastLockoutDate
                                );
            
return user;
         }       
/// <summary>
        
/// Encrypts a string using the SHA256 algorithm.
        
/// </summary>
        public static string HashPassword(string plainMessage)
         {
            
byte[] data = Encoding.UTF8.GetBytes(plainMessage);
            
using (HashAlgorithm sha = new SHA256Managed())
             {
                
byte[] encryptedBytes = sha.TransformFinalBlock(data, 0, data.Length);
                
return Convert.ToBase64String(sha.Hash);
             }
         }
     }
}
5.修改AccountController中MvcDemo.Controllers.AccountMembershipService,采用DbMembershipProvider
         public AccountMembershipService()
        {
             _provider
=   new Helper.DbMembershipProvider();
         }
6.加入前后台验证,即可实现初步的成员资格
7.待续……

转载于:https://www.cnblogs.com/libsource/archive/2009/09/20/1570426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值