Microsoft 标识自定义用户、角色、声明继承

Posted

技术标签:

【中文标题】Microsoft 标识自定义用户、角色、声明继承【英文标题】:Microsoft Identity Custom User, Role, Claim Inheritance 【发布时间】:2017-10-02 04:55:46 【问题描述】:

大家好,我正在尝试从标准 AspNet 表继承。

我的意图是使用 Guid 作为主键并扩展基本的 AspNetUser 带有一些属性。此外,我想重命名表名。

现在是这样的:

public class User : IdentityUser<Guid, UserLogin, UserRole, UserClaim>


    public User()  

    public User(string userName)
    
        this.UserName = userName;
    


    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User, Guid> manager)
    
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    
 

我的 DbContext 如下所示:

 public class CustomDBContext : IdentityDbContext<User, Role, Guid, UserLogin, UserRole, UserClaim>


     public static CustomDBContext Create()
    
        return new CustomDBContext();
    

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
    

        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<IdentityRole<Guid, UserRole>>().ToTable("Roles");
        modelBuilder.Entity<IdentityUserLogin<Guid>>().ToTable("UserLogins");
        modelBuilder.Entity<IdentityUserClaim<Guid>>().ToTable("UserClaims");
        modelBuilder.Entity<IdentityUserRole<Guid>>().ToTable("UserRoles");
        modelBuilder.Entity<IdentityUser<Guid, UserLogin, UserRole, UserClaim>>().ToTable("Users");

    

不幸的是,当我尝试生成我的迁移时。我得到了那个错误:

未映射类型“Microsoft.AspNet.Identity.EntityFramework.IdentityRole`2[System.Guid,Easy1WebAPIData.Models.UserRole]”。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否被显式排除。验证该类型是否被定义为一个类,不是原始的或泛型的,并且不是从 EntityObject 继承的。

有什么想法吗?最好的问候!

【问题讨论】:

这里有一个帖子可以满足您的要求。您可以将页面翻译成英文或关注照片:es.***.com/questions/442819/… 【参考方案1】:

我相信您只需要在OnModelCreating 方法中映射您的扩展模型。我正在我的一个项目中执行以下操作,并且它在迁移中运行良好。

public class ApplicationUser : IdentityUser<Guid, CustomUserLogin, CustomUserRole, CustomUserClaim>  
public class CustomUserRole : IdentityUserRole<Guid>  
public class CustomUserClaim : IdentityUserClaim<Guid>  
public class CustomUserLogin : IdentityUserLogin<Guid>  
public class CustomRole : IdentityRole<Guid, CustomUserRole>  

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, Guid, CustomUserLogin, CustomUserRole, CustomUserClaim> 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ApplicationUser>().ToTable("Users");
        modelBuilder.Entity<CustomRole>().ToTable("Roles");
        modelBuilder.Entity<CustomUserRole>().ToTable("UserRoles");
        modelBuilder.Entity<CustomUserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<CustomUserClaim>().ToTable("UserClaims");
    

另外,如果您使用 Guid 作为键,在对象的构造函数中设置 Id 是很常见的。

public class ApplicationUser : IdentityUser<Guid, CustomUserLogin, CustomUserRole, CustomUserClaim>

    public ApplicationUser()
    
        public ApplicationUser()
        
            Id = Guid.NewGuid();
        
    

【讨论】:

【参考方案2】:

终于成功了!谢谢@Phil Thomas

        modelBuilder.Entity<User>().ToTable("User").Property(p => p.Id).HasColumnName("UserID");
        modelBuilder.Entity<User>().Property(p => p.Email).HasColumnName("EmailAddress");

        modelBuilder.Entity<UserRole>().HasKey(r => new  r.RoleId, r.UserId );
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<UserRole>().Property(r => r.UserId).HasColumnName("UserID");
        modelBuilder.Entity<UserRole>().Property(r => r.RoleId).HasColumnName("RoleID");

        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserLogin>().Property(r => r.UserId).HasColumnName("UserID");

        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<UserClaim>().Property(r => r.Id).HasColumnName("UserClaimID");

        modelBuilder.Entity<Role>().HasKey<Guid>(r => r.Id);
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<Role>().Property(r => r.Id).HasColumnName("RoleID");

        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;

【讨论】:

以上是关于Microsoft 标识自定义用户、角色、声明继承的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 身份中的角色声明与自定义身份验证中的角色权限相比

如何在 IAM 角色的信任策略中检查自定义 OpenID 声明?

用户访问查看 Microsoft Azure 中的自定义报告

二、Activiti-自定义用户表

在c语言中自定义了一个函数,在main中调用时提示找不到标识符,怎么办?

微信小程序自定义导航栏,实现不同用户角色登陆后显示不同的tabbar(避坑版)