asp.net - 如何添加管理员角色(我的解决方案)

标签 asp.net asp.net-core asp.net-identity asp.net-core-1.0

我找不到任何有效的解决方案...我尝试了每个谷歌结果。 我为此奋斗了几个小时。

所以我只需将我的新角色插入到 SQL 表中:

insert into [dbo].[AspNetRoles] ( [Id]
      ,[ConcurrencyStamp]
      ,[Name]
      ,[NormalizedName] )
values(1,NULL,'Admin','Admin') ;

Insert into [dbo].[AspNetUserRoles] (  [UserId]
      ,[RoleId] )
VALUES('user_id_from_[dbo].[AspNetUsers]' , 1 )

我认为这太丑陋了,而且是我能做的最糟糕的事情,但它确实有效。

关于SO,有一个答案被标记为解决方案: Asp.Net core MVC6 How to initially add roles in Identity 3

但在谷歌中寻找答案后,我真的不知道如何在 Startup.cs 中正确初始化 roleManager。

我什至不相信这真的那么难。我想我只是错过了一些线索。

最佳答案

通常,管理员角色会在创建架构时植入数据库。您正在使用身份来创建或设定管理员角色。 Identity 使用代码优先方法,以便您可以尽可能地自定义它。不要手动使用 SQL 查询。以下是您可以使用 DI 在运行时创建具有管理员权限数据的管理员用户的方法,因为 EFCore 尚不支持对播种数据的内置支持(它将在更新中支持)。

要种子数据,请在数据文件夹中创建一个类(例如AdministratorSeedData.cs)并添加以下代码。

public class AdministratorSeedData
{
    private RoleManager<IdentityRole> _roleManager;
    private UserManager<ApplicationUser> _userManager;

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

    public async Task EnsureSeedDataAsync()
    {
        if (await _userManager.FindByEmailAsync("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="03706c6e666c6d6643706c6e666c6d662d606c6e" rel="noreferrer noopener nofollow">[email protected]</a>") == null)
        {
            ApplicationUser administrator = new ApplicationUser()
            {
                UserName = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cdbea2a0a8a2a3a88dbea2a0a8a2a3a8e3aea2a0" rel="noreferrer noopener nofollow">[email protected]</a>",
                Email = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0675696b636968634675696b636968632865696b" rel="noreferrer noopener nofollow">[email protected]</a>"
            };

            await _userManager.CreateAsync(administrator, "Passw0rd123!");
            await _roleManager.CreateAsync(new IdentityRole("Administrator"));

            IdentityResult result = await _userManager.AddToRoleAsync(administrator, "Administrator");
        }
    }
}

然后在 Startup.cs 类中,在 DI 容器中将此服务注册为:

    public void ConfigureServices(IServiceCollection services)
    {
        ....
        services.AddTransient<AdministratorSeedData>();
    }

    public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, AdministratorSeedData seeder)
    {
        ....
        await seeder.EnsureSeedDataAsync();
    }

确保没有创建数据库。运行应用程序,您将看到具有管理员角色的用户已成功创建。

关于asp.net - 如何添加管理员角色(我的解决方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39181663/

相关文章:

c# - asp.net 身份表未创建

C# ASP.NET MasterPage 嵌套继承是邪恶的

c# - 使用 Controller 方法注入(inject) Dotnet 核心方法

c# - 删除文件 vs 目录 + 重新创建性能

c# - 在 .Net Core 2.0 + SQLite EFCore 中,并发检查不适用于 'delete'

c# - 在 Asp .net 核心 Web Api 中接受 x-www-form-urlencoded

asp.net - 为什么ASP.NET Identity中的注销使用POST而不是GET?

c# - 如何通过 Cordova 和 OAuth.io 使用身份用户管理?

c# - ASP.NET 5 Process.Start?

asp.net - 基类包含字段 'X' ,但其类型 (System.Web.UI.ScriptManager) 与控件类型 (System.Web.UI.ScriptManager) 不兼容