Asp.net core Asp.net核心标识用户的多个角色

Asp.net core Asp.net核心标识用户的多个角色,asp.net-core,identity,claims-based-identity,role-base-authorization,Asp.net Core,Identity,Claims Based Identity,Role Base Authorization,我正在从事asp.net核心3.1项目。项目中有几种类型的用户。例如: 一些用户键入了 管理员 作家 经理 会计人员 接线员 而且 用户类型不同,可能会增加或减少。在这个项目中,我们可能有20个编写器或100个操作员用户,所有编写器或操作员都有相同的角色。 现在我可以手动为用户设置角色。但我想为用户设置一组角色。 例如,如果用户类型是operator,则所有角色都取决于operator设置为user。我创建了一个简单的演示,您可以在注册用户时选择UserType。并将UserType的所有相关角

我正在从事asp.net核心3.1项目。项目中有几种类型的用户。例如:

一些用户键入了

管理员

作家

经理

会计人员

接线员

而且

用户类型不同,可能会增加或减少。在这个项目中,我们可能有20个编写器或100个操作员用户,所有编写器或操作员都有相同的角色。 现在我可以手动为用户设置角色。但我想为用户设置一组角色。
例如,如果用户类型是operator,则所有角色都取决于operator设置为user。

我创建了一个简单的演示,您可以在注册用户时选择
UserType
。并将
UserType
的所有相关角色分配给用户

1.型号:

public class ApplicationUser : IdentityUser
{
    [ForeignKey("UserType")]
    public int UserTypeId {get;set;}
    public UserType UserType { get; set; }
}

public class UserType
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public List<ApplicationUser> Users { get; set; }
    public List<ApplicationRole> Roles { get; set; }
}

public class ApplicationRole : IdentityRole
{
    [ForeignKey("UserType")]
    public int? UserTypeId {get;set;}
    public UserType UserType { get; set; }
}
公共类应用程序用户:IdentityUser
{
[外键(“用户类型”)]
public int UserTypeId{get;set;}
公共用户类型用户类型{get;set;}
}
公共类用户类型
{
[关键]
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表用户{get;set;}
公共列表角色{get;set;}
}
公共类应用程序角色:IdentityRole
{
[外键(“用户类型”)]
public int?UserTypeId{get;set;}
公共用户类型用户类型{get;set;}
}
2.DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public DbSet<UserType> UserTypes { get; set; }
    public DbSet<ApplicationRole> AppRoles { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);


        modelBuilder.Entity<ApplicationUser>()
        .HasOne(c => c.UserType)
        .WithMany(u=>u.Users)
        .OnDelete(DeleteBehavior.Restrict);


    }
}
public类ApplicationDbContext:IdentityDbContext
{
公共应用程序DBContext(DbContextOptions选项)
:基本(选项)
{
}
公共数据库集用户类型{get;set;}
公共DbSet逼近{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity()
.HasOne(c=>c.UserType)
.具有多个用户(u=>u.Users)
.OnDelete(DeleteBehavior.Restrict);
}
}
3.Register.cshtml.cs

public class InputModel
    {

        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }

        public int UserTypeId { get; set; }
    }

public async Task OnGetAsync(string returnUrl = null)
    {

        ViewData["UserType"] = new SelectList(_context.UserTypes, "Id", "Name");

        ReturnUrl = returnUrl;
        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
    }

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
    {

        returnUrl = returnUrl ?? Url.Content("~/");
        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email, UserTypeId = Input.UserTypeId };
            var result = await _userManager.CreateAsync(user, Input.Password);
            if (result.Succeeded)
            {
                //add bunch of roles to user
                var roles = _context.AppRoles.Where(r => r.UserTypeId == user.UserTypeId).Select(r => r.Name).ToList();
                foreach(var role in roles)
                {
                   await _userManager.AddToRoleAsync(user, role);
                }

               //...
            }
            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
        }

        // If we got this far, something failed, redisplay form
        return Page();
    }
公共类输入模型
{
[必需]
[电邮地址]
[显示(Name=“电子邮件”)]
公共字符串电子邮件{get;set;}
[必需]
[StringLength(100,ErrorMessage={0}必须至少为{2}个字符,最大长度为{1}个字符。”,最小长度=6)]
[数据类型(数据类型.密码)]
[显示(Name=“密码”)]
公共字符串密码{get;set;}
[数据类型(数据类型.密码)]
[显示(Name=“确认密码”)]
[比较(“密码”,ErrorMessage=“密码和确认密码不匹配。”)]
公共字符串ConfirmPassword{get;set;}
public int UserTypeId{get;set;}
}
公共异步任务OnGetAsync(字符串返回URL=null)
{
ViewData[“UserType”]=新的选择列表(_context.UserTypes,“Id”,“Name”);
ReturnUrl=ReturnUrl;
ExternalLogins=(wait _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
}
公共异步任务OnPostAsync(字符串returnUrl=null)
{
returnUrl=returnUrl??Url.Content(“~/”);
ExternalLogins=(wait _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if(ModelState.IsValid)
{
var user=newapplicationuser{UserName=Input.Email,Email=Input.Email,UserTypeId=Input.UserTypeId};
var result=await\u userManager.CreateAsync(用户,输入,密码);
if(result.successed)
{
//向用户添加一组角色
var roles=_context.AppRoles.Where(r=>r.UserTypeId==user.UserTypeId).Select(r=>r.Name.ToList();
foreach(角色中的var角色)
{
wait_userManager.AddToRoleAsync(用户,角色);
}
//...
}
foreach(result.Errors中的变量错误)
{
AddModelError(string.Empty,error.Description);
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回页();
}
4.Register.cshtml

<form asp-route-returnUrl="@Model.ReturnUrl" method="post">
        <h4>Create a new account.</h4>
        <hr />
        <div asp-validation-summary="All" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Input.Email"></label>
            <input asp-for="Input.Email" class="form-control" />
            <span asp-validation-for="Input.Email" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Input.Password"></label>
            <input asp-for="Input.Password" class="form-control" />
            <span asp-validation-for="Input.Password" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Input.ConfirmPassword"></label>
            <input asp-for="Input.ConfirmPassword" class="form-control" />
            <span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Input.UserTypeId"></label>
            <select asp-for="Input.UserTypeId" asp-items="@ViewBag.UserType" class="form-control"></select>

        </div>
        <button type="submit" class="btn btn-primary">Register</button>
 </form>

创建一个新帐户。

登记
4.Startup.cs

services.AddDefaultIdentity<ApplicationUser>()
            .AddRoles<ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>();
services.AddDefaultIdentity()
.AddRoles()
.AddEntityFrameworkStores();

可以为每个用户分配多个roles@citronas是的,我知道。如果我将用户指定给经理,我希望拥有所有经理角色。这意味着将角色设置为用户类型,将用户类型设置为用户