9

Güncel literatüre baktım ama yeni IdentityStore sisteminin kendi veritabanınızla nasıl çalışacağını tam olarak öğrenmek için uğraşıyorum.Varolan veritabanıyla yeni MVC5 Kimlik Doğrulaması nasıl kullanılır

Veritabanımın Kullanıcı tablosu aşağıda bir örnek sınıf olarak tblMember olarak adlandırılmıştır.

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

anda kullanıcıların benzersiz membership_id ile giriş ve sonra birincil anahtar sistem boyunca kimliği kullanmıyor. Bu sistemde yeterli olmayan benzersiz bir kullanıcı adı senaryosu kullanamıyorum.

Gördüğüm örneklerle, sistemin bana oldukça esnektir, ancak şu anda numaralı tablonun membership_id kullanarak kimlik doğrulaması yapmak için yerel oturum açma işlemini nasıl yapacağı konusunda egzersiz yapamıyorum ve daha sonra erişime sahip olacağım Kullanıcılar, kullanıcı özelliği üzerinden herhangi bir denetleyiciden kayıt atar.

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

cevap

4

sen EF kullandığınız varsayarsak, böyle bir şey yapmak mümkün olmalıdır:

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; } } 
} 

Temelde yerel şifre mağaza yeni sistemde IUserSecretStore denir. Sen bu yüzden her şeyi doğru uygulanan varsayarak gibi AccountController yapıcı içine varlık türüne takmak gerekir: Kullanıcı mülkiyet kullanıcının iddialarını içerecek

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

Not ve NameIdentifier iddia IUser.Id için eşler Kimlik sisteminde mülkiyet. Bu doğrudan bir kullanıcı adı/gizli mağaza olan IUserSecret'e bağlı değildir. Sistem modelleri = "Yerel" providerKey = username ve loginProvider ile yerel giriş

Düzenleme gibi bir yerel şifresi: yanı bir Özel Kullanıcı örneği ekleme

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); 
    } 

DÜZENLEME # 2: Ayrıca, Kullanıcı Tarafından genişletilemeyen özel kullanıcılar çalışmaz, bu nedenle, kullanıcı için IUser yerine Döküm IdentityAuthenticationmanager.GetUserClaims uygulanmasında bir hata var.

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

Eğer eksiksiz bir örnek verebilir misiniz:

Burada geçersiz kılmak için kullanabileceğiniz kod. Kullanıcılarım tablosuyla eşleşen kendi Kullanıcı sınıfımı kullanmak istiyorum. Görünüşe göre çözüm arayan tek kişi ben değilim: http://stackoverflow.com/questions/17399933/how-do-i-configure-the-users-context-table –

+0

Cevabımı özel olarak içerecek şekilde düzenledim Kullanıcı, Kullanıcıyı genişletmek yerine büyük olasılıkla IUser uygulayacaktır, ancak kodun geri kalanı aynı –

+0

@Hao Kung olmalıdır, şu anda bunu doğru bir şekilde nasıl uygulayacağınız konusunda şaşkınım, bunun hala beta sürümde olduğunu takdir ediyorum. Kendi veritabanı/şifre deponuza özelleştirme ve bağlantı kurma hakkında gerçek bir ayrıntı görünmüyor, farkında olduğunuz başka örnekler/kaynaklar var mı? – Tim

İlgili konular