2011-06-10 51 views
4

我正在構建一個自定義MembershipProvider更精確的GetUser函數。自定義MembershipUser只有需要的參數

爲此我有一個自定義的MembershipUser。

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

在MembershipProvider的GetUser函數中,我獲取用戶數據並將它們放入CustomMemberShipUser中。

public override MembershipUser GetUser(string email, bool userIsOnline) 
    { 
     User u = _db.Users.Where(x => x.Email == email).First(); 
     CustomMemberShipUser customUser = new CustomMemberShipUser (
             "CustomMemberShipUser ", 
             u.Email, 
             u.id, 
             u.Email, 
             "", 
             "", 
             true, 
             false, 
             u.CreateDate, 
             DateTime.MinValue, 
             DateTime.MinValue, 
             DateTime.MinValue, 
             DateTime.MinValue); 
     return customUser ; 
    } 

正如你可以看到我使用電子郵件作爲名稱的成員,我不最需要的其它參數。

有沒有辦法讓通話更簡單?我不想用空字符串和最小日期值初始化MembershipUser。提前

感謝

+0

我不認爲你可以避免它。但是你可以讓你的構造函數減少參數 – Eranga 2011-06-10 07:06:27

+0

如果你正在使用SQL-Server作爲DBMS和標準的ASP.Net DB架構,你可以讓你的自定義MembershipProvider繼承自[SqlMembershipProvider](http://msdn.microsoft.com /en-us/library/system.web.security.sqlmembershipprovider.aspx)。 SqlMembershipProvider有一個[公共構造函數沒有參數](http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider.sqlmembershipprovider%28v=vs.80%29.aspx#1)。 – 2011-06-10 07:20:40

+0

@Tim hes試圖使用自定義成員資格提供程序。如果您的Membership構造函數中有參數,Asp.net運行時如何實例化它? – Eranga 2011-06-10 07:25:06

回答

4

你能適應你的CustomMembershipUser爲做「填充」你

public class CustomMemberShipUser : MembershipUser 
    { 
     public CustomMemberShipUser (
      string email, 
      object providerUserKey, 
      ): base(
       "CustomMemberShipUser", email, providerUserKey, email, String.Empty, 
       String.Empty, true, false, DateTime.MinValue, DateTime.MinValue, 
       DateTime.MinValue, DateTime.MinValue, DateTime.MinValue) 
     { 
     } 
    } 

它並不能解決問題,但它會收拾你的供應商將成爲

public override MembershipUser GetUser(string email, bool userIsOnline) 
    { 
     User u = _db.Users.Where(x => x.Email == email).First(); 
     CustomMemberShipUser customUser = new CustomMemberShipUser (u.Email, u.id); 
     return customUser ; 
    } 

我推測你的CustomMembershipUser正在公開你沒有向我們展示的一些附加屬性。按照現狀,你可以返回一個MembershipUser。有了上述唯一的好處,你的CustomMembershipUser給你的是在你的CustomMembershipProvider清潔結構

+0

感謝您的回答,atm我不使用其他附加屬性。我只使用自定義實體進行認證,我想將其映射到MembershipUser,所以我可以使用[Authenticate]。這是正確的方式嗎?還是有更好的解決方案? – r3d 2011-06-10 09:01:14

+0

在這種情況下,您可以廢棄CustomMembershipUser類並使用[Authorize]屬性來確保用戶在訪問您的頁面之前登錄。在驗證登錄請求方面,您應該在您的MembershipProvider類中重寫ValidateUser,並使用您的邏輯來檢查密碼等。 – NinjaNye 2011-06-10 09:15:24

+0

這可能值得一看:http://theintegrity.co.uk/2010/11/asp-net-mvc- 2-custom-membership-provider-tutorial-part-1/ – NinjaNye 2011-06-10 09:21:53