首页 > 解决方案 > Header 中自定义字段的不记名令牌

问题描述

我的端点使用令牌来授权执行,但标题“授权”字段用于网关令牌。我想设置一个不同的标头键来传递和读取我的端点中的令牌并避免冲突。

这是我的控制器代码:

        [HttpPost]
        [ApiVersion("1.0")]
        [ProducesResponseType(typeof(ErrorMessageDto), 500)]
        [Authorize(AuthenticationSchemes = "Bearer")]
        [ProducesResponseType(typeof(NavMenuItemReturnDto), 201)]
        public IActionResult CreateNavMenuItem(NavMenuItemUpdateCreateDto newNavMenuItem)
        {
            try
            {
                return StatusCode(201, _navMenuItemsBL.CreateNewNavMenuItem(newNavMenuItem).Result);
            }
            catch (Exception ex)
            {
                return StatusCode(500, new ErrorMessageDto { Error = ex.Message });
            }
        }

这是我的启动代码:

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer("Bearer", options =>
                {
                    options.Authority = Configuration.GetSection("JwtAuthority").Get<string>();

                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuerSigningKey = false,
                        ValidateAudience = false,
                        RequireExpirationTime = false,
                        ValidateLifetime = false,
                        ValidateIssuer = false,
                    };
                });

有什么建议么?谢谢您的帮助

标签: c#.netheaderauthorizationtoken

解决方案


您能否通过添加多个身份验证模式来实现您的目标?

一个例子如下:

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://localhost:5000/identity/";
        })
        .AddJwtBearer("AzureAD", options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://login.microsoftonline.com/eb971100-6f99-4bdc-8611-1bc8edd7f436/";
        });
}

只有一个 JWT 不记名身份验证注册到默认身份验证方案 JwtBearerDefaults.AuthenticationScheme。必须使用唯一的身份验证方案注册附加身份验证。

下一步是更新默认授权策略以接受两种身份验证方案。例如:

        services.AddAuthorization(options =>
        {
            var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
                JwtBearerDefaults.AuthenticationScheme,
                "AzureAD");
            defaultAuthorizationPolicyBuilder = 
                defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
            options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
        });

由于默认授权策略被覆盖,因此可以在控制器中使用 [Authorize] 属性。然后控制器接受由第一个或第二个颁发者发出的带有 JWT 的请求。

现在你有了默认的 AzureAD


推荐阅读