Giả sử bạn đang sử dụng EF, bạn sẽ có thể làm điều gì đó như thế này:
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; } }
}
Về cơ bản các cửa hàng mật khẩu địa phương được gọi là IUserSecretStore trong hệ thống mới. Bạn sẽ có thể cắm vào loại thực thể của bạn vào các nhà xây dựng AccountController như vậy giả sử bạn thực hiện tất cả mọi thứ một cách chính xác:
public AccountController()
{
var db = new IdentityDbContext<User, UserClaim, tblMember, UserLogin, Role, UserRole>();
StoreManager = new IdentityStoreManager(new IdentityStoreContext(db));
}
Note sở hữu tài khoản sẽ chứa tuyên bố của người dùng, và tuyên bố NameIdentifier sẽ vạch cho IUser.Id thuộc tính trong hệ thống Identity. Đó không phải là trực tiếp gắn liền với IUserSecret mà chỉ là một tên người dùng/cửa hàng bí mật. Các mô hình hệ thống mật khẩu địa phương như một tên đăng nhập cục bộ với providerKey = tên người dùng, và loginProvider = "Địa phương"
Edit: Thêm một ví dụ về Tuỳ chỉnh tài khoản cũng
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: Ngoài ra còn có một lỗi trong việc thực hiện IdentityAuthenticationmanager.GetUserClaims được đúc cho người dùng thay vì IUser, do đó, người dùng tùy chỉnh không mở rộng từ người dùng sẽ không hoạt động.
Dưới đây là đoạn code mà bạn có thể sử dụng để ghi đè lên:
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;
}
Ông có thể vui lòng cung cấp một ví dụ hoàn chỉnh. Tôi muốn sử dụng lớp người dùng của riêng tôi để ánh xạ tới bảng Người dùng của tôi. Có vẻ như tôi không phải là người duy nhất tìm kiếm giải pháp: http://stackoverflow.com/questions/17399933/how-do-i-configure-the-users-context-table –
Đã chỉnh sửa câu trả lời của tôi để chứa một tùy chỉnh Người dùng, bạn có thể sẽ triển khai IUser thay vì mở rộng User, nhưng phần còn lại của mã phải giống như –
@Hao Kung, tôi hiện đang bối rối về cách thực hiện điều này một cách chính xác, tôi đánh giá cao điều này vẫn còn trong bản beta nhưng xuất hiện không có chi tiết thực sự về tùy chỉnh và liên kết đến kho lưu trữ cơ sở dữ liệu/mật khẩu của riêng bạn, có thêm bất kỳ ví dụ/tài nguyên nào mà bạn biết không? – Tim