【问题标题】:How can I access JwtBearer authentication handler configuration in a controller action?如何在控制器操作中访问 JwtBearer 身份验证处理程序配置?
【发布时间】:2019-08-14 17:46:52
【问题描述】:

我有一个配置为使用 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 属性?

我已确认JwtBearerHandlerHttpContext.RequestServices 中的注册服务,但其Options 属性始终为null

【问题讨论】:

    标签: c# asp.net-core jwt jwt-auth


    【解决方案1】:

    找到答案: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;
    
            // ...
        }
        // ...
    }
    // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多