我有一个配置为使用 JWT 持有者令牌进行身份验证的 ASP.NET Core Web 应用程序:
// Setup.cs
// ...
public void ConfigureServices(IServiceCollection services) {
services
.AddAuthentication()
.AddJwtBearer(
options =>
{
options.Authority = "https://known.authority.url";
});
}
// ...
应用具有控制器操作,可在其中接收使用 POST 请求正文中的相同密钥信息签名的 JWT。
// TokenController.cs
// ...
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> ActionAsync()
{
using (var stream = new MemoryStream())
using (var reader = new StreamReader(stream))
{
await Request.Body.CopyToAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
var jwt = await reader.ReadToEndAsync();
// ...
}
// ...
}
// ...
我想使用在持有者令牌身份验证处理程序中配置的相同验证参数和签名密钥来验证控制器操作中收到的 JWT。(理想情况下,不要重复控制器操作的配置。
如何在控制器操作中访问身份验证处理程序的JwtBearerOptions
Configuration
属性?
我已经确认JwtBearerHandler
是HttpContext.RequestServices
注册服务,但它的Options
属性始终是null
。
找到答案:ASP.NET 注册一个IAuthenticationHandlerProvider
服务,该服务可用于通过其方案检索身份验证处理程序。
因此,在修改Startup.cs
文件以包含 JWT 持有者处理程序的身份验证方案后:
// Startup.cs
// ...
public void ConfigureServices(IServiceCollection services)
{
services
.AddAuthentication()
.AddJwtBearer(
authenticationScheme: "MY_AUTH_SCHEME", // NEW
options =>
{
options.Authority = "https://known.authority.url";
});
}
// ...
使用身份验证处理程序提供程序服务及其GetHandlerAsync
方法来获取处理程序及其选项:
// TokenController.cs
// ...
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> ActionAsync()
{
// NEW
var provider = HttpContext.RequestServices.GetService<IAuthenticationHandlerProvider>();
// NEW
var handler = await provider.GetHandlerAsync(HttpContext, "MY_AUTH_SCHEME") as
AuthenticationHandler<JwtBearerOptions>;
// NEW
var jwtBearerOptions = handler.Options;
using (var stream = new MemoryStream())
using (var reader = new StreamReader(stream))
{
await Request.Body.CopyToAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
var jwt = await reader.ReadToEndAsync();
// NEW
var tokenValidationParameters = jwtBearerOptions.TokenValidationParameters;
// ...
}
// ...
}
// ...