我正在使用Identity 2.1来处理我的asp.net应用程序中的用户角色.到目前为止,我创建了从IdentityDBContext扩展的新上下文,扩展了IdentityUser和IdentityRole以添加几个新字段.但是,每当我尝试使用U
用户
public class User : IdentityUser{ public string Name { get; set; } public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager, string authenticationType) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); // Add custom user claims here return userIdentity; } }
角色
public partial class Role : IdentityRole { public string Description { get; set; } }
数据库上下文
namespace Carbon.Models { public partial class CarbonEDM : IdentityDbContext<User, Role, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>{ public CarbonEDM() : base("name=CarbonDB") { } public static CarbonEDM Create() { return new CarbonEDM(); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<User>().ToTable("Users", "dbo"); modelBuilder.Entity<Role>().ToTable("Roles", "dbo"); modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles", "dbo"); modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims", "dbo"); modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins", "dbo"); } } }
ApplicationUserManager
public class ApplicationUserManager : UserManager<User> { public ApplicationUserManager(IUserStore<User> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<User>(context.Get<CarbonEDM>())); // Configure validation logic for usernames manager.UserValidator = new UserValidator<User>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // Configure validation logic for passwords manager.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = false, RequireDigit = false, RequireLowercase = false, RequireUppercase = false, }; // Configure user lockout defaults manager.UserLockoutEnabledByDefault = true; manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); manager.MaxFailedAccessAttemptsBeforeLockout = 5; var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider<User>(dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } }
最后,只要在迁移过程中出现错误:
protected override void Seed(Carbon.Models.CarbonEDM context) { DbContextTransaction transaction = null; transaction = context.Database.BeginTransaction(); if (!context.Roles.Any()) { var roleStore = new RoleStore<Role>(context); var roleManager = new RoleManager<Role>(roleStore); roleManager.Create(new Role { Name = "Admin" }); roleManager.Create(new Role { Name = "Control Unit Operator" }); roleManager.Create(new Role { Name = "Lab Operator" }); roleManager.Create(new Role { Name = "Production Engineer" }); roleManager.Create(new Role { Name = "Production Operator" }); } if (!context.Users.Any()) { var userStore = new UserStore<User>(context); var userManager = new ApplicationUserManager(userStore); var _user = new User { Email = "yehiasalam@live.com", PhoneNumber = "+20 12 23461340", Name = "Yehia A.Salam", UserName = "yehiasalam@live.com" }; userManager.Create(_user, "pass@word"); userManager.AddToRole(_user.Id, "Admin"); /* IdentityRole error here */ } context.SaveChanges(); transaction.Commit(); base.Seed(context); } }
对不起,很长的帖子,我试图包括一切.
好吧所以问题出在UserStore上,默认声明是public class UserStore<TUser> : UserStore<TUser, IdentityRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUserStore<TUser>, IUserStore<TUser, string>, IDisposable where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser {
它具有显式声明的IdentityRole,而不是使用像TUser这样的泛型表示法,因此我们只需要创建从父UserStore扩展的另一个类:
public class CarbonUserStore<TUser> : UserStore<TUser, Role, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUserStore<TUser>, IUserStore<TUser, string>, IDisposable where TUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser { public CarbonUserStore(DbContext context) :base(context) {} }
微软并不酷,我花了一天的时间试图让它等待.但是,它已添加到随vNext发送的身份包中(必须喜欢它开源):
https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs
public class UserStore<TUser, TRole, TContext> : UserStore<TUser, TRole, TContext, string> where TUser : IdentityUser, new() where TRole : IdentityRole, new() where TContext : DbContext { public UserStore(TContext context, IdentityErrorDescriber describer = null) : base(context, describer) { } }