c# - 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,
};
});
有什么建议么?谢谢您的帮助
解决方案
您能否通过添加多个身份验证模式来实现您的目标?
一个例子如下:
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
推荐阅读
- ruby-on-rails - 设计 - 没有 active_for_authentication 的 bypass_sign_in?打回来
- c# - Windows XP 上捆绑的 .NET 应用程序
- arduino - 随时间绘制 PWM 的简单方法
- java - 在 Glassfish 上执行应用程序时出错
- xquery - 如何在marklogic中对字符串日期进行排序?
- node.js - 我需要不断更新对文本文件所做的更改并在浏览器中显示而不刷新
- vba - 如何在vba中获取查找结果的计数
- angular - TSLint while() 语句中没有未使用的函数
- spring - java.util.Map.Entry 无法解析错误
- firebase - 是否可以在不验证用户身份的情况下从颤动中更新 Firebase CloudFirestore?