【问题标题】:Asp.Net core MVC6 How to initially add roles in Identity 3Asp.Net core MVC6如何在Identity 3中初始添加角色
【发布时间】:2016-08-16 21:32:02
【问题描述】:

我在 Stackoverflow 中寻找过这个,到目前为止,似乎有很多关于在 Identity 1 和 2 中添加角色的问题,但在 Identity 3 中却有所不同。

我想在数据库中播种角色。我只有两个。我打算使用已注入课程的 _roleManager。没关系。我的问题是.. 似乎没有任何方法可以实际添加角色.. 使用 CreateAsync 是为了将用户添加到角色中.. 你如何编写代码以使用“_userManager”添加角色或者你必须这样做另一种方式?

【问题讨论】:

  • _roleManager 用于创建角色,_userManager 用于将用户添加到角色。我已经发布了帮助的答案
  • 我有你可能感兴趣的a project here,它实现了身份3的多租户用户和角色管理

标签: asp.net-mvc asp.net-core asp.net-identity-3


【解决方案1】:

编辑

身份

在 Identity 中,RoleManager 用于创建角色,UserManager 用于将用户添加到角色。 这是一个为您指明正确方向的示例。以下代码用于创建新角色Administrator

if (!roleManager.RoleExists("Administrator"))
            {
                MyIdentityRole newRole = new MyIdentityRole("Administrator", "Administrators can do something with data");
                roleManager.Create(newRole);
            }  

编辑

此外,这是用于将用户添加到角色,这也是一个示例:

 \\assuming you test if the user has been assigned to the role "Administrator" before adding them to that role

 if(RoleAdministrator == true){
           userManager.AddToRole(User.Id, "Administrator");
       }

【讨论】:

  • 我在过去一个小时左右一直在玩这个,它出现在 Identity 3 中,rolemanager 没有 create... 或任何可以创建角色的方法。我数了 22 种方法角色管理器...
  • 好奇:为什么对 Identity 3 使用不同的方法? RoleManager 仍然存在,显然是管理角色的推荐方法。
  • @si2030 roleManager 应该有create 方法。你可以在这里找到它msdn.microsoft.com/en-us/library/dn613286(v=vs.108).aspx
  • 在 Identity Core 中它将是 createAsync。 docs.asp.net/projects/api/en/latest/autoapi/Microsoft/…
  • 你不需要检查角色是否存在。它是RoleValidator 中默认模型的一部分。 var newRole = new ApplicationRole { Name = model.RoleName, Description = model.RoleDescription }; var result = await roleManager.CreateAsync(newRole); if (result.Succeeded) // do something else // do something else - error will be in result.errors { foreach (var error in result.Errors) // do something with error }
【解决方案2】:
public class SeedData
{
    private const string _adminRoleName = "admin";
    private string _adminEmail = "admin@demo.com";
    private string _adminPassword = "P@ssw0rd!PK";

    private string[] _roles = new string[] { _adminRoleName, "supervisor" };

    private readonly RoleManager<IdentityRole<Guid>> _roleManager;
    private readonly UserManager<ApplicationUser> _userManager;

    public  static async Task Run(IServiceProvider serviceProvider)
    {
        using (var serviceScope =serviceProvider
                                 .GetRequiredService<IServiceScopeFactory>()
                                 .CreateScope())
        {
            var instance = serviceScope.ServiceProvider.GetService<SeedData>();
            await instance.Initialize();

            var context = serviceScope.ServiceProvider.GetService<AppDbContext>();
            if (!context.Products.Any())
            {
               // Seed Other entities Here
            }

            await context.SaveChangesAsync();
        }
    }

    public SeedData(UserManager<ApplicationUser> userManager, 
                                  RoleManager<IdentityRole<Guid>> roleManager)
    {
        _roleManager = roleManager;
        _userManager = userManager;
    }

    public async Task Initialize()
    {
        foreach (var role in _roles)
        {
            if (!await _roleManager.RoleExistsAsync(role))
            {
                await _roleManager.CreateAsync(new IdentityRole<Guid>(role));
            }
        }

        var adminUsers = await _userManager.GetUsersInRoleAsync(_adminRoleName);
        if (!adminUsers.Any())
        {
            var adminUser = new ApplicationUser()
            {
                Id = Guid.NewGuid(),
                Email = _adminEmail,
                UserName = _adminEmail
            };

            var result = await _userManager.CreateAsync(adminUser, _adminPassword);
            if(result.Success)
            {
               await _userManager.AddToRoleAsync(adminUser, _adminRoleName);
            }
       }         
   }
}

在您的 Program.cs 中

public static void Main(string[] args)
{
     var host = BuildWebHost(args);

     using (var scope = host.Services.CreateScope())
     {
         var services = scope.ServiceProvider;
         try
         {
              SeedData.Run(services).Wait();
         }
         catch (Exception ex)
         {
             var logger = services.GetRequiredService<ILogger<Program>>();
             logger.LogError(ex, "Error while seeding database.");
         }
     }

      host.Run();
  }

可能对某人有帮助:)

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2018-05-17
    • 2021-06-16
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2018-01-08
    相关资源
    最近更新 更多