9

के साथ नए एमवीसी 5 प्रमाणीकरण का उपयोग कैसे करें मैंने वर्तमान साहित्य को देखा है, लेकिन मैं अपने खुद के डेटाबेस के साथ नया IdentityStore सिस्टम काम करने के तरीके के बारे में कसरत करने के लिए संघर्ष कर रहा हूं।मौजूदा डेटाबेस

मेरा डेटाबेस की उपयोगकर्ता तालिका tblMember नीचे एक उदाहरण वर्ग कहा जाता है।

public partial class tblMember 
{ 
    public int id { get; set; } 
    public string membership_id { get; set; } 
    public string password { get; set; } 
    ....other fields 
} 

वर्तमान में उन membership_id जो अद्वितीय है के साथ लॉगिन और फिर मैं प्रणाली है जो प्राथमिक कुंजी है भर आईडी का उपयोग करें। मैं लॉगिन के लिए उपयोगकर्ता नाम परिदृश्य का उपयोग नहीं कर सकता क्योंकि यह इस प्रणाली पर पर्याप्त अद्वितीय नहीं है।

उदाहरण मैंने देखा है प्रणाली की तरह मुझे काफी लचीला बनाया गया है यह लग रहा है के साथ

, लेकिन मैं नहीं कर सकते हैं वर्तमान में कसरत कैसे मेरे tblmember तालिका का उपयोग करने membership_id का उपयोग कर प्रमाणित करने के लिए स्थानीय लॉगिन पाने के लिए और फिर मैं उपयोग होगा उपयोगकर्ता उपयोगकर्ता संपत्ति के माध्यम से किसी भी नियंत्रक से रिकॉर्ड tblMember।

http://blogs.msdn.com/b/webdev/archive/2013/07/03/understanding-owin-forms-authentication-in-mvc-5.aspx

उत्तर

4

मान लिया जाये कि आप एफई उपयोग कर रहे हैं, तो आप इस तरह कुछ करने के लिए सक्षम होना चाहिए:

public partial class tblMember : IUserSecret 
{ 
    public int id { get; set; } 
    public string membership_id { get; set; } 
    public string password { get; set; } 
    ....other fields 

    /// <summary> 
    /// Username 
    /// </summary> 
    string UserName { get { return membership_id; set { membership_id = value; } 

    /// <summary> 
    /// Opaque string to validate the user, i.e. password 
    /// </summary> 
    string Secret { get { return password; } set { password = value; } } 
} 

मूल रूप से स्थानीय पासवर्ड की दुकान नई प्रणाली में IUserSecretStore कहा जाता है। तुम बहुत यह सोचते हैं आप सही तरीके से सब कुछ कार्यान्वित की तरह AccountController निर्माता में अपने इकाई प्रकार में प्लग करने के लिए सक्षम होना चाहिए:

public AccountController() 
    { 
     var db = new IdentityDbContext<User, UserClaim, tblMember, UserLogin, Role, UserRole>(); 
     StoreManager = new IdentityStoreManager(new IdentityStoreContext(db)); 
    } 

नोट उपयोगकर्ता संपत्ति उपयोगकर्ता के दावों में शामिल होंगे, और NameIdentifier दावा IUser.Id करने के लिए नक्शे होगा पहचान प्रणाली में संपत्ति। यह सीधे IUserSecret से बंधे नहीं है जो सिर्फ एक उपयोगकर्ता नाम/गुप्त स्टोर है। प्रणाली मॉडल providerKey = उपयोगकर्ता नाम और loginProvider के साथ एक स्थानीय लॉगिन = "स्थानीय"

संपादित के रूप में एक स्थानीय पासवर्ड: साथ ही एक कस्टम उपयोगकर्ता का एक उदाहरण जोड़ना

public class CustomUser : User { 
     public string CustomProperty { get; set; } 
    } 

    public class CustomUserContext : IdentityStoreContext { 
     public CustomUserContext(DbContext db) : base(db) { 
      Users = new UserStore<CustomUser>(db); 
     } 
    } 

    [TestMethod] 
    public async Task IdentityStoreManagerWithCustomUserTest() { 
     var db = new IdentityDbContext<CustomUser, UserClaim, UserSecret, UserLogin, Role, UserRole>(); 
     var manager = new IdentityStoreManager(new CustomUserContext(db)); 
     var user = new CustomUser() { UserName = "Custom", CustomProperty = "Foo" }; 
     string pwd = "password"; 
     UnitTestHelper.IsSuccess(await manager.CreateLocalUserAsync(user, pwd)); 
     Assert.IsTrue(await manager.ValidateLocalLoginAsync(user.UserName, pwd)); 
     CustomUser fetch = await manager.Context.Users.FindAsync(user.Id) as CustomUser; 
     Assert.IsNotNull(fetch); 
     Assert.AreEqual("Custom", fetch.UserName); 
     Assert.AreEqual("Foo", fetch.CustomProperty); 
    } 

संपादित करें # 2: IdentityAuthenticationmanager.GetUserClaims के कार्यान्वयन में भी एक बग है जो IUser के बजाय उपयोगकर्ता को कास्टिंग कर रहा है, इसलिए कस्टम उपयोगकर्ता जो उपयोगकर्ता से विस्तार नहीं कर रहे हैं, काम नहीं करेंगे।

internal const string IdentityProviderClaimType = "http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider"; 
    internal const string DefaultIdentityProviderClaimValue = "ASP.NET Identity"; 

/// <summary> 
/// Return the claims for a user, which will contain the UserIdClaimType, UserNameClaimType, a claim representing each Role 
/// and any claims specified in the UserClaims 
/// </summary> 
public override async Task<IList<Claim>> GetUserIdentityClaims(string userId, IEnumerable<Claim> claims) { 
    List<Claim> newClaims = new List<Claim>(); 
    User user = await StoreManager.Context.Users.Find(userId) as IUser; 
    if (user != null) { 
     bool foundIdentityProviderClaim = false; 
     if (claims != null) { 
      // Strip out any existing name/nameid claims that may have already been set by external identities 
      foreach (var c in claims) { 
       if (!foundIdentityProviderClaim && c.Type == IdentityProviderClaimType) { 
        foundIdentityProviderClaim = true; 
       } 
       if (c.Type != ClaimTypes.Name && 
        c.Type != ClaimTypes.NameIdentifier) { 
        newClaims.Add(c); 
       } 
      } 
     } 
     newClaims.Add(new Claim(UserIdClaimType, userId, ClaimValueTypes.String, ClaimsIssuer)); 
     newClaims.Add(new Claim(UserNameClaimType, user.UserName, ClaimValueTypes.String, ClaimsIssuer)); 
     if (!foundIdentityProviderClaim) { 
      newClaims.Add(new Claim(IdentityProviderClaimType, DefaultIdentityProviderClaimValue, ClaimValueTypes.String, ClaimsIssuer)); 
     } 
     var roles = await StoreManager.Context.Roles.GetRolesForUser(userId); 
     foreach (string role in roles) { 
      newClaims.Add(new Claim(RoleClaimType, role, ClaimValueTypes.String, ClaimsIssuer)); 
     } 
     IEnumerable<IUserClaim> userClaims = await StoreManager.Context.UserClaims.GetUserClaims(userId); 
     foreach (IUserClaim uc in userClaims) { 
      newClaims.Add(new Claim(uc.ClaimType, uc.ClaimValue, ClaimValueTypes.String, ClaimsIssuer)); 
     } 
    } 
    return newClaims; 
} 
+0

आप एक पूरा उदाहरण प्रदान कृपया सकते हैं:

यहाँ कोड है कि आप ओवरराइड करने के लिए उपयोग कर सकते हैं। मैं अपनी खुद की उपयोगकर्ता कक्षा को उपयोगकर्ता बनाना चाहता हूं जो मेरे उपयोगकर्ता तालिका में मैप करता है। ऐसा लगता है कि मैं समाधान की तलाश में अकेला नहीं हूं: http://stackoverflow.com/questions/17399933/how-do-i-configure-the-users-context-table –

+0

एक कस्टम युक्त रखने के लिए मेरा जवाब संपादित किया उपयोगकर्ता, आप उपयोगकर्ता को विस्तारित करने के बजाय IUser को लागू करेंगे, लेकिन शेष कोड एक ही –

+0

@ हाओ कुंग होना चाहिए, मैं वर्तमान में इस तरीके से इसे कार्यान्वित करने के तरीके में उलझन में हूं, मैं सराहना करता हूं कि यह अभी भी बीटा में है लेकिन वहां अपने डेटाबेस/पासवर्ड स्टोर को कस्टमाइज़ करने और जोड़ने के बारे में कोई वास्तविक विवरण नहीं दिखता है, क्या आपके पास कोई और उदाहरण/संसाधन हैं जिन्हें आप जानते हैं? – Tim

संबंधित मुद्दे