Bạn có thể tạo một lớp Người dùng không liên quan gì đến ASP.NET Identity trong thư viện lõi của bạn.
public class User {
public Guid UserId { get; set; }
public string UserName { get; set; }
public string EmailAddress { get; set; }
public string EmailAddressConfirmed { get; set; }
public string PhoneNumber { get; set; }
public string PhoneNumberConfirmed { get; set; }
public string PasswordHash { get; set; }
public string SecurityStamp { get; set; }
...
public virtual ICollection<Role> Roles { get; set; }
public virtual ICollection<UserClaim> UserClaims { get; set; }
public virtual ICollection<UserLogin> UserLogins { get; set; }
}
Nếu bạn đang sử dụng Entity Framework, hãy tạo một lớp cấu hình cho các thực thể của bạn (tùy chọn).
internal class UserConfiguration : EntityTypeConfiguration<User>
{
internal UserConfiguration()
{
ToTable("User");
HasKey(x => x.UserId)
.Property(x => x.UserId)
.HasColumnName("UserId")
.HasColumnType("uniqueidentifier")
.IsRequired();
Property(x => x.PasswordHash)
.HasColumnName("PasswordHash")
.HasColumnType("nvarchar")
.IsMaxLength()
.IsOptional();
Property(x => x.SecurityStamp)
.HasColumnName("SecurityStamp")
.HasColumnType("nvarchar")
.IsMaxLength()
.IsOptional();
Property(x => x.UserName)
.HasColumnName("UserName")
.HasColumnType("nvarchar")
.HasMaxLength(256)
.IsRequired();
// EmailAddress, PhoneNumber, ...
HasMany(x => x.Roles)
.WithMany(x => x.Users)
.Map(x =>
{
x.ToTable("UserRole");
x.MapLeftKey("UserId");
x.MapRightKey("RoleId");
});
HasMany(x => x.UserClaims)
.WithRequired(x => x.User)
.HasForeignKey(x => x.UserId);
HasMany(x => x.UserLogins)
.WithRequired(x => x.User)
.HasForeignKey(x => x.UserId);
}
}
Bạn cũng phải tạo các lớp cho Vai trò, UserClaim và UserLogin . Bạn có thể đặt tên cho chúng bất cứ thứ gì bạn chọn nếu bạn không thích những cái tên trên.
Trong lớp web, tạo một lớp có tên là AppUser (Hoặc tên khác nếu bạn chọn). Lớp này nên thực hiện các ASP.NET nhận dạng IUser <TKey> giao diện, nơi TKey là kiểu dữ liệu cho các khóa chính ( Guid trong ví dụ trên).
public class AppUser : IUser<Guid>
{
public AppUser()
{
this.Id = Guid.NewGuid();
}
public AppUser(string userName)
: this()
{
this.UserName = userName;
}
public Guid Id { get; set; }
public string UserName { get; set; }
public string EmailAddress { get; set; }
public string EmailAddressConfirmed { get; set; }
public string PhoneNumber { get; set; }
public string PhoneNumberConfirmed { get; set; }
public string PasswordHash { get; set; }
public string SecurityStamp { get; set; }
}
Thay đổi tất cả các tham chiếu đến UserManager trong dự án web thành UserManager <AppUser, Guid> .
Cuối cùng, tạo UserStore của riêng bạn . Về cơ bản, UserStore tùy chỉnh sẽ lấy đối tượng AppUser , chuyển đổi nó thành đối tượng thực thể Người dùng , sau đó duy trì nó. Một ví dụ về một trong những phương pháp này được hiển thị dưới đây:
public class UserStore :
IUserLoginStore<AppUser, Guid>,
IUserClaimStore<AppUser, Guid>,
IUserRoleStore<AppUser, Guid>,
IUserPasswordStore<AppUser, Guid>,
IUserSecurityStampStore<AppUser, Guid>,
IUserStore<AppUser, Guid>,
IDisposable
{
private User MapFromAppUser(AppUser appUser)
{
if (appUser == null)
return null;
var userEntity = new User();
PopulateUser(userEntity, appUser);
return userEntity;
}
private void PopulateUser(User user, AppUser appUser)
{
user.UserId = appUser.Id;
user.UserName = appUser.UserName;
user.EmailAddress = appUser.EmailAddress;
user.EmailAddressConfirmed = appUser.EmailAddressConfirmed;
user.PhoneNumber = appUser.PhoneNumber;
user.PhoneNumberConfirmed = appUser.PhoneNumberConfirmed;
user.PasswordHash = appUser.PasswordHash;
user.SecurityStamp = appUser.SecurityStamp;
// First name, last name, ...
}
#region IUserStore<AppUser, Guid> Members
public Task CreateAsync(AppUser appUser)
{
if (appUser == null)
throw new ArgumentNullException("appUser");
var userEntity = MapFromAppUser(appUser);
// Persist the user entity to database using a data repository.
// I'll leave this to you.
}
...
#endregion
}
Để có được một mô tả đầy đủ về một triển khai có thể, bấm vào đây .
Cuối cùng, đó là sự lựa chọn của bạn. Đo lường số lượng nỗ lực mà bạn cần để duy trì việc triển khai này thay vì chỉ tham khảo khung Nhận dạng trong thư viện Core của bạn. Cá nhân, tôi đã nghĩ làm theo cách mà tôi đã mô tả ở trên, tuy nhiên, tôi đã không làm vì tôi có khả năng phải thay đổi mã của mình mỗi khi cập nhật khung nhận dạng ASP.NET.
Hy vọng điều này sẽ giúp và trả lời câu hỏi của bạn!