如何添加/检查使用 Identityserver4 保护的策略和角色 .net 核心 API

问题描述 投票:0回答:1

我对使用身份服务器保护 API 有疑问4

身份资源

姓名 理赔
角色 角色

API资源

姓名 范围
testapi api1

APIScopes

姓名 理赔
api1 地址

在 Startup.cs 中

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
                .AddJwtBearer("Bearer", opt =>
                {
                    opt.Audience = "testapi";

                    opt.Authority = "https://localhost:5001";
                    opt.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                    {
                       ValidateAudience = true
                       
                    };
                });
//Policy "Apiscope" created 
services.AddAuthorization(opt =>
            {
                opt.AddPolicy("Apiscope", policy =>
                {
                    policy.RequireAuthenticatedUser();
                    policy.RequireClaim("Scope", "api1");
                    
                });

            });

services.AddAuthorization(opt =>
            {
                opt.AddPolicy("AdminUsers", policy =>
                {
                    policy.RequireAuthenticatedUser();
                    policy.RequireRole("admin");

                });

            });

在控制器中

[HttpPost]
        [Authorize(Policy = "AdminUsers")]
        public IActionResult GetAdminMessage()
        {
            return Ok("Hello Admin");
        }
  1. .Net Core API 中是否可以访问身份范围?如果是,怎么办?
  2. 要获得角色值,我是否需要在“api1”用户声明的 APIScopes 中添加为“地址、角色”或者 可以通过上面的 Q1 完成?
  3. 在策略“AdminUser”中,我通过将“api1”(APIScopes) 用户声明添加为“地址、角色”来检查角色,但我无法访问 GetAdminMessage()。如何实现?
asp.net-core-webapi identityserver4 roles policy
1个回答
0
投票

.Net Core API 中是否可以访问身份范围?如果是,怎么办?

IdentityResources 中的声明进入 ID-Token。当您登录客户端 (AddOpenIDConnect) 时,ID-Token 的内容被“转换”为 ClaimsPrincipal 用户对象。之后不使用 ID 令牌。

要获取角色值,我是否需要将“api1”用户声明的 APIScopes 添加为“地址、角色”,或者可以通过上面的 Q1 完成?

APIScopes 在 API 端。 API 接收访问令牌,它包含来自 ApiSCopes 和 ApiResources 的用户声明。 access-token 中的声明被转换为 API 中的用户对象(使用 AddJwtBearer),您可以使用 AddPolicy 系统对用户进行授权。

在策略“AdminUser”中,我通过将“api1”(APIScopes) 用户声明添加为“地址、角色”来检查角色,但我无法访问 GetAdminMessage()。如何实现?

ASP.NET Core 和 IdentityServer 对声明类型(名称)应该是什么有不同的看法,所以你需要告诉 AddJwtBearer 你的角色声明的真实名称是什么,通过使用:

    .AddJwtBearer(opt =>
    {
        ...
        opt.TokenValidationParameters.RoleClaimType = "roles";
        opt.TokenValidationParameters.NameClaimType = "name";

您还可以在 ConfigureServices 方法的顶部添加:

public void ConfigureServices(IServiceCollection services)
{
    // By default, Microsoft has some legacy claim mapping that converts
    // standard JWT claims into proprietary ones. This removes those mappings.
    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();

如果这没有帮助,您也可以尝试添加:

options.ClaimActions.MapUniqueJsonKey("role", "role");

为了补充这个答案,我写了一篇博客文章,详细介绍了这个主题: 解决 ASP.NET Core 中的 JwtBearer 身份验证问题在 ASP.NET Core 中调试 OpenID Connect 声明问题

© www.soinside.com 2019 - 2024. All rights reserved.