1

我總是使用我自己的代碼來創建登錄和註冊,但使用成員資格應該可以爲我在以下項目中編程這些東西節省大量時間。定製會員實施

現在我發現了許多關於實現自己的自定義成員資格的教程,其中一些教程與其他教程不同。而且我很難理解實施簡單的自定義成員資格實施的最佳解決方案。

對於這個項目,我只需要添加一些額外的用戶信息,如streetname,郵編等

什麼目前我所做的是:

 public class CustomMembershipUser : MembershipUser 
{ 
    public CustomMembershipUser(
     string providerName, 
     string name, 
     object providerUserKey, 
     string email, 
     string passwordQuestion, 
     string comment, 
     bool isApproved, 
     bool isLockedOut, 
     DateTime creationDate, 
     DateTime lastLoginDate, 
     DateTime lastActivityDate, 
     DateTime lastPasswordChangedDate, 
     DateTime lastLockoutDate 
     ) 
     : base(providerName, name, providerUserKey, email, passwordQuestion, 
     comment, isApproved, isLockedOut, creationDate, lastLoginDate, 
     lastActivityDate, lastPasswordChangedDate, lastLockoutDate) 
    { 
    } 

    // Add additional properties 
    public string Streetname { get; set; } 
    public string Postcode { get; set; } 

} 

public abstract class CustomMembershipProvider : MembershipProvider 
{ 

    public override MembershipUser GetUser(string username, bool userIsOnline) 
    { 
     // get data logic 
     var user = new CustomMembershipUser(
        "CustomMembershipProvider", 
        "naam", 
        "1", 
        "[email protected]", 
        "", 
        "", 
        true, 
        false, 
        DateTime.Now, 
        DateTime.MinValue, 
        DateTime.MinValue, 
        DateTime.MinValue, 
        DateTime.MinValue) { Streetname = "Test", Postcode = "Test2"}; 

     return user; 

    } 

    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, 
     bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
    { 
     var user = new CustomMembershipUser(
       "CustomMembershipProvider", 
       "naam", 
       "1", 
       "[email protected]", 
       "", 
       "", 
       true, 
       false, 
       DateTime.Now, 
       DateTime.MinValue, 
       DateTime.MinValue, 
       DateTime.MinValue, 
       DateTime.MinValue) { Streetname = "Test", Postcode = "Test2" }; 
     status = MembershipCreateStatus.Success; 
     return user; 
    } 
} 

這是最好的解決方案我的自定義會員資格還是有更好的選擇?

我還沒有測試過,所以我不知道這是否有效。

我使用MVC 4

回答

1

關於成員關係的第一件事就是它與名稱,地址等無關......它嚴格地關於用戶名,用戶名,密碼和身份驗證。而已。不要試圖擴展它來添加名稱和地址,這不是它的用途。

相反,您只需創建您自己的「UserProfile」表或您想調用它的任何內容。此表應該由成員資格提供者提供的ProviderUserKey鍵入。然後,您只需在UserProfile表中查找想要的任何數據,而無需修改任何與Membership相關的任何數據。

因此,在您的情況下,您可以使用標準的成員資格提供程序,該標識的成員資格提供程序在GUID上鍵入。然後創建一個名爲UserProfile的表,它具有3列。 UserId(uniqueidentifier),StreetName和PostalCode。

在您的應用程序中,您調用Membership.GetUser()。ProviderUserKey並將其用作在UserProfile表中查找數據的關鍵。這很快速,簡單,並且不需要對Membership進行自定義修改。

在您的AccountController.Register方法中,您將在創建成員用戶之後,使用用戶ProviderUserKey創建一個UserProfile記錄以及您想要存儲的信息。

1

我建議使用ASP.NET身份:http://www.asp.net/identity

要上頂的是什麼IdentityUser收集相對容易添加額外的數據。這是默認的用戶表:

  • 編號
  • 用戶名
  • PasswordHash
  • SecurityStamp

要添加在最上層的這些數據,您只需從IdentityUser繼承:

public class AppUser : IdentityUser 
{ 
    // Add additional properties 
    public string Streetname { get; set; } 
    public string Postcode { get; set; } 
} 

您可以添加額外的f根據我的理解,MembershipProvider是一個過時的系統來處理身份驗證,因爲ASP.NET身份更靈活和開放。

我也建議將所有額外字段抵消到一個Profile類 - 只是我發現更好 - 填充一個配置文件表而不是用戶表與所有這些不同的字段 - 但我相信歸結爲個人偏好。