【问题标题】:ASP .Net Core Identity Role Claims not adding to UserASP .Net 核心身份角色声明未添加到用户
【发布时间】:2019-01-06 17:20:07
【问题描述】:

我在使用角色/声明时遇到问题。

我已经创建了角色并给出了角色声明。然后将这些角色分配给用户,从我在线阅读的内容来看,这意味着用户应该继承角色声明,但他们没有。该政策不起作用,经过进一步检查,我在通过 JSON 输出用户声明时看不到声明。

正如我所见,所有数据都保存在数据库中。

角色/声明播种者

 public static void SeedRolesAndClaims(RoleManager<IdentityRole> roleManager)
    {
        // Create Roles
        IdentityRole adminRole = new IdentityRole("Admin");
        roleManager.CreateAsync(adminRole).Wait();

        roleManager.AddClaimAsync(adminRole, new Claim(ClaimTypes.AuthorizationDecision, "edit.post")).Wait();
        roleManager.AddClaimAsync(adminRole, new Claim(ClaimTypes.AuthorizationDecision, "delete.post")).Wait();
        roleManager.AddClaimAsync(adminRole, new Claim(ClaimTypes.AuthorizationDecision, "create.post")).Wait();
        roleManager.AddClaimAsync(adminRole, new Claim(ClaimTypes.AuthorizationDecision, "view.post")).Wait();
        roleManager.AddClaimAsync(adminRole, new Claim(ClaimTypes.AuthorizationDecision, "create.comment")).Wait();

        IdentityRole userRole = new IdentityRole("User");
        roleManager.CreateAsync(userRole).Wait();
        roleManager.AddClaimAsync(userRole, new Claim(ClaimTypes.AuthorizationDecision, "create.comment")).Wait();

    }

用户播种器

ApplicationUser user = new ApplicationUser { UserName = "john@email.com", FirstName = "Admin", LastName = "Smith", Email = "john@email.com" };
        userManager.CreateAsync(user, "Password123*").Wait();
        userManager.AddToRoleAsync(user, "Admin").Wait();

我正在做的检查是

        var claims = User.Claims.Select(claim => new { claim.Type, claim.Value }).ToArray();
        return Json(claims);

返回基本 JSON 声明以进行身份​​验证

[{"type":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier","value":"05bef53e-dd97-41f6-beee-531501cf8598"},{"type":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name","value":"john@email.com"},{"type":"AspNet.Identity.SecurityStamp","value":"SGS23ZGIY6UYOOL2APWRIZKNT2V6QBJC"}]

我不确定问题是什么,并且已经在 google/stackoverflow 上搜索了一段时间,但没有成功。

任何帮助将不胜感激

【问题讨论】:

    标签: c# asp.net-core asp.net-identity


    【解决方案1】:

    如果您使用的是 .Net Core 2.1 ,您似乎需要根据 this issue 更改默认身份配置。

    在 .Net Core 2.1 中,您可以先创建自己的ApplicationUser

    public class ApplicationUser : IdentityUser
    {
    }
    

    修改你的 dbcontext :

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

    使用旧式 api 配置身份:

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddRoleManager<RoleManager<IdentityRole>>()
    .AddDefaultUI()
    .AddDefaultTokenProviders()
    .AddEntityFrameworkStores<ApplicationDbContext>();
    

    然后播种用户和角色,例如:

    private async Task CreateUserRoles(IServiceProvider serviceProvider)
    {
        var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        var UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
    
        IdentityResult roleResult;
        //Adding Admin Role
        var roleCheck = await RoleManager.RoleExistsAsync("Admin");
        if (!roleCheck)
        {
    
            IdentityRole adminRole = new IdentityRole("Admin");
            //create the roles and seed them to the database
            roleResult = await RoleManager.CreateAsync(adminRole);
    
            RoleManager.AddClaimAsync(adminRole, new Claim(ClaimTypes.AuthorizationDecision, "edit.post")).Wait();
            RoleManager.AddClaimAsync(adminRole, new Claim(ClaimTypes.AuthorizationDecision, "delete.post")).Wait();
    
            ApplicationUser user = new ApplicationUser { UserName = "v-nany@hotmail.com", Email = "v-nany@hotmail.com" };
            UserManager.CreateAsync(user, "xxxxxx").Wait();
    
            await UserManager.AddToRoleAsync(user, "Admin");
        }
    
    }
    
    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env ,IServiceProvider serviceProvider)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
    
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
    
        app.UseAuthentication();
    
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    
        CreateUserRoles(serviceProvider).Wait();
    }
    

    最后,注销并重新登录帐户,声明应该在那里:

    如果您使用的是 .Net Core 2.0,您的代码应使用默认标识模板。

    【讨论】:

    • 这是一种有趣的方法。不知道这在我使用的 CORE 3.1 中是否有所不同,但是需要注册更多的东西才能让 RoleManager 和 UserManager 解决。最初,传递给这些构造函数的所有具体实现应该是什么并不完全清楚。
    猜你喜欢
    • 2020-01-07
    • 2020-08-04
    • 2020-01-24
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多