9

私は現在の文献を調べましたが、自分のデータベースで新しいIdentityStoreシステムを動作させる方法を正確に練習するのには苦労しています。既存のデータベースで新しいMVC5認証を使用する方法

私のデータベースのユーザーテーブルは、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でログインしてから、私は主キーでシステム全体のIDを使用します。このシステムでは、固有のものではないため、ログインにユーザー名のシナリオを使用することはできません。

私が見た例では、システムは私にはかなり可鍛性ですが、現時点ではtblmemberテーブルを使用してローカルログインを取得してmembership_idを使用して認証する方法がありません。ユーザーは、Userプロパティを使用して、コントローラのいずれかからtblMemberレコードを作成します。

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

答えて

4

あなたがEFを使用していると仮定すると、あなたはこのような何かを行うことができるはず:

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と呼ばれています。

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

は、ユーザープロパティは、ユーザーの主張が含まれています、とNameIdentifierの請求がIUser.Idにマッピングされます注意:あなたは、あなたがすべてを正しく実装すると仮定ようAccountControllerのコンストラクタにあなたのエンティティタイプをプラグインすることができるはずです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); 
    } 

EDIT#2: IdentityUuthenticationmanager.GetUserClaimsの実装には、IUserではなくUserにキャストしているバグもあります。そのため、Userから拡張されていないカスタムユーザーは動作しません。ここで

は、あなたがオーバーライドするために使用できるコードです:

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

@Hao Kung、私は現在、これを正しく実装する方法については混乱していますが、これはまだベータ版ですが、あなた自身のデータベース/パスワードストアへのカスタマイズとリンクについての実際の詳細は表示されません。あなたが認識している例やリソースは何ですか? – Tim

関連する問題