2

默認情況下,ASP.NET MVC將AccountController設置爲使用SqlMembershipProvider,SqlProfileProvider和SqlRoleProvider。實際上,我並不需要所有的東西,事實上,將我的數據塑造成該模型更麻煩。什麼是我需要獲得用戶身份驗證和授權的最低ASP.NET提供程序實現?

什麼是我需要在MembershipProvider,RoleProvider和ProfileProvider抽象類上實現以獲取身份驗證和授權並且不會破壞可能存在的某些其他依賴關係的最小值?

例如,在ProfileProvider上它希望我重寫「FindInactiveProfilesByUserName」方法,但我並不在意這個功能。當NotImplementedException異常激發時,我的應用程序將在哪裏中斷?

此外,在MembershipProvider上,例如,我不需要FindUsersByEmail方法。如果我沒有實現它,ASP.NET MVC會在什麼時候窒息?如果是這樣,在哪裏?

回答

3

據我所知,ASP.NET MVC在身份驗證方面並沒有爲你做任何事情。考慮到這一點,正如@chrispr所說的,你只需要實現ValidateUser,並且由ASP.NET MVC項目模板創建的項目只在認證過程中調用該方法。

關於授權,我在Reflector中看了AuthorizationAttribute,發現它叫IPrincipal.IsInRole。在Reflector中查看System.Web.Security.RolePrincipalIsInRole調用GetRolesForUser,因此您可以嘗試僅實現該方法。

我實施了類似的理由定製提供商(我不喜歡SQL供應商使用的模式),但我選擇不實現自定義配置文件提供者,因爲它似乎依靠配置設置配置文件屬性,和我不想走那條路(見ASP.NET Profile Properties Overview)。

作爲一個附註,我發現在Reflector中查看SqlMembershipProviderSqlRoleProvider在我實現自己的提供程序時很有用,因此您可能也想這樣做。

3

我相信你只需要在MembershipProvider上實現ValidateUser來利用MembershipProvider的身份驗證功能。其餘功能由提供的Web控件(如CreateUserWizard)調用,因此請確保在使用這些控件時禁用任何不支持的功能。至於其他(RoleProvider和ProfileProvider),如果您沒有使用任何與用戶角色或用戶配置文件相關的功能,則不必實施任何成員。

0

下面是我在我的定義提供:

namespace MyProject 
{ 
    public class SqlMembershipProvider : System.Web.Security.SqlMembershipProvider 
    { 
     private string ConnectionString { get; set; } 

     public override bool ChangePassword(string userName, string oldPassword, string newPassword) 
     { 
      // 
     } 

     public overrideMembershipUser CreateUser(string userName, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
     { 
      // 
     } 

     private MembershipUser CreateUser(string userName, string password, object providerUserKey, out MembershipCreateStatus status) 
     { 
      // 
     } 

     public override bool DeleteUser(string userName, bool deleteAllRelatedData) 
     { 
      // 
     } 

     public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
     { 
      this.ConnectionString = ConfigurationManager.ConnectionStrings[config["connectionStringName"]].ConnectionString; 

      base.Initialize(name, config); 
     } 

     public override MembershipUser GetUser(string userName, bool userIsOnline) 
     { 
      // 
     } 

     public override bool ValidateUser(string userName, string password) 
     { 
      // 
     } 
    } 
} 

和:

namespace MyProject 
{ 
    public class SqlRoleProvider : System.Web.Security.RoleProvider 
    { 
     private string ConnectionString { get; set; } 

     public override void AddUsersToRoles(string[] userNames, string[] roleNames) 
     { 
      // 
     } 

     public override string ApplicationName 
     { 
      get 
      { 
       throw new NotSupportedException(); 
      } 
      set 
      { 
       throw new NotSupportedException(); 
      } 
     } 

     public override void CreateRole(string roleName) 
     { 
      throw new NotSupportedException(); 
     } 

     public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
     { 
      throw new NotSupportedException(); 
     } 

     public override string[] FindUsersInRole(string roleName, string userNameToMatch) 
     { 
      throw new NotSupportedException(); 
     } 

     public override string[] GetAllRoles() 
     { 
      // 
     } 

     public override string[] GetRolesForUser(string userName) 
     { 
      // 
     } 

     public override string[] GetUsersInRole(string roleName) 
     { 
      throw new NotSupportedException(); 
     } 

     public override bool IsUserInRole(string userName, string roleName) 
     { 
      // 
     } 

     public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
     { 
      this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings[config["connectionStringName"]].ConnectionString; 

      base.Initialize(name, config); 
     } 

     public override void RemoveUsersFromRoles(string[] userNames, string[] roleNames) 
     { 
      throw new NotSupportedException(); 
     } 

     public override bool RoleExists(string roleName) 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 
相關問題