【问题标题】:ASP.Net Core Check Role Claims With IdentityServer4ASP.Net Core 使用 IdentityServer4 检查角色声明
【发布时间】:2020-12-30 13:35:48
【问题描述】:

我正在使用 ASP.Net 核心 3.1。 在我的 IdentityServer 中,我添加了这样的用户和角色

public static void EnsureSeedData(IServiceProvider serviceProvider)
    {
        var RoleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
        var UserManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();

        IdentityResult roleResult;
        //Adding Admin Role
        var roleCheck = RoleManager.RoleExistsAsync("Admin").Result;
        if (!roleCheck)
        {

            IdentityRole adminRole = new IdentityRole("Admin");
            //create the roles and seed them to the database
            roleResult = RoleManager.CreateAsync(adminRole).Result;

            RoleManager.AddClaimAsync(adminRole, new Claim("TestClaim1", bool.TrueString)).Wait();
            RoleManager.AddClaimAsync(adminRole, new Claim("TestClaim2", bool.TrueString)).Wait();
            RoleManager.AddClaimAsync(adminRole, new Claim("TestClaim3", bool.FalseString)).Wait();
        }

        var alice = UserManager.FindByNameAsync("alice").Result;
        if (alice == null)
        {
            alice = new IdentityUser
            {
                UserName = "alice",
                Email = "AliceSmith@email.com",
                EmailConfirmed = true,
            };
            var result = UserManager.CreateAsync(alice, "Pass123$").Result;
            if (!result.Succeeded)
            {
                throw new Exception(result.Errors.First().Description);
            }

            result = UserManager.AddClaimsAsync(alice, new Claim[]{
                        new Claim(JwtClaimTypes.Name, "Alice Smith"),
                        new Claim(JwtClaimTypes.GivenName, "Alice"),
                        new Claim(JwtClaimTypes.FamilyName, "Smith"),
                        new Claim(JwtClaimTypes.WebSite, "http://alice.com"),
                    }).Result;
            if (!result.Succeeded)
            {
                throw new Exception(result.Errors.First().Description);
            }

            UserManager.AddToRoleAsync(alice, "Admin").Wait();
            //Log.Debug("alice created");
        }
    }

在我的网络应用程序中,

services.AddAuthentication("Bearer")
            .AddJwtBearer("Bearer", options =>
            {
                options.Authority = "https://localhost:5001";
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateAudience = false
                };
            });

     

但在控制器User.Claims 中没有角色声明,只有用户声明。

所以如果我想拥有角色声明,我应该通过提供 ProfileService 向 IdentityServer 中的用户添加角色声明,就像这样

public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var id = context.Subject.FindFirst("sub").Value;
        var user = _userManager.FindByIdAsync(id).Result;
        var roles = _userManager.GetRolesAsync(user).Result;
        var claims = new List<Claim>();
        foreach (var role in roles)
        {
            var roleObj = _roleManager.FindByNameAsync(role).Result;
            var roleClaims = _roleManager.GetClaimsAsync(roleObj).Result;
            claims.AddRange(roleClaims);
        }
        
        var nameClaims = context.Subject.FindAll(JwtClaimTypes.Name);
        context.IssuedClaims.AddRange(claims);
        context.IssuedClaims.AddRange(nameClaims);
        return Task.CompletedTask;
    }

这是正确的方式吗?还是有其他推荐的方式?

任何帮助将不胜感激

【问题讨论】:

  • 我的回答对您有帮助吗?或者你想让我在我的答案中添加一些东西吗?否则,如果您愿意,请随时接受我的回答。

标签: asp.net-identity identityserver4 claims-based-identity


【解决方案1】:

要查看角色,您可能需要在 AddJwtBearer 中添加:

            options.TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = JwtClaimTypes.Name,
                RoleClaimType = JwtClaimTypes.Role,

            };

问题是 IdentityServer 和 ASP.NET Core 不同意角色声明的名称应该是什么,所以你需要在这里做一个映射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2020-08-20
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    相关资源
    最近更新 更多