使用 WebAPI 中的 Jwt Bearer Authentication 中间件自定义 WWW-Authenticate challenge header

Customize WWW-Authenticate challenge header with Jwt Bearer Authentication middleware in WebAPI

我在 .NET WebAPI 项目中使用 JwtBearerAuthentication Katana 中间件来通过 JWT 保护我的网站 API。

所以,在我的 Startup class 中,我只是在做一些简单的事情,比如:

 app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                AllowedAudiences = new[] { audience },
                IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
                {
                    new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret)
                }
            });

一切正常,只有一个例外。

当客户端传入无效或丢失的 Bearer 令牌时,WWW-Authenticate 响应 header 只是 "Bearer"。

我想自定义 header 以包括我的授权服务器的地址和支持的授权类型。

更像是:WWW-Authenticate: MyAuth href=url,grant_type="supported-grants" 或其他...

最好的方法是什么?我很惊讶 JwtBearerAuthenticationOptions class 不包含挑战 属性。我可以解决这个问题,但想知道这里是否有关于 Jwt 中间件的最佳实践。

我们最终使用 OAuthBearerAuthenticationProvider 中的 OnApplyChallenge 插入了我们想要的值 WWW-Authenticate header。

大致如下:

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions ...
   Provider = new OAuthBearerAuthenticationProvider()....
      OnApplyChallenge = (context) => context.OwinContext.Response.Headers.AppendValue(WWWAuthenticateHeader,values)