JwtBearerHandler,带有用于发现端点的授权标头

时间:2018-10-25 16:35:15

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

我正在将ASP.NET Core 2.1与JwtBearer方案一起用于身份验证,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(o =>
        {
            // my options here
        });
}

相当标准,但是我遇到的麻烦是我的令牌颁发机构发现端点需要授权才能访问。我需要做的是将基本身份验证标头注入到JWT中间件对我的权限终结点所做的请求中。我正在查看配置选项,但看不到任何允许我执行此操作的东西。我还在查看源代码,看是否可以看到在哪里发出了HTTP请求,但是通过抽象和扩展方法将其混淆了,但是我还没有找到它。

有人可以告诉我是否可以在某处设置此地址,还是我必须创建自己的授权处理程序并将其手动捆绑在一起?任何建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

默认情况下,JwtBearer身份验证方案将使用ConfigurationManager进行.well-known/openid-configuration公开的配置。如果您没有通过设置JwtBearerOptions.ConfigurationManager属性来显式配置实例,那么它将自动创建一个after your configuration

var httpClient = new HttpClient(options.BackchannelHttpHandler ?? new HttpClientHandler());
httpClient.Timeout = options.BackchannelTimeout;
httpClient.MaxResponseContentBufferSize = 1024 * 1024 * 10; // 10 MB

options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(options.MetadataAddress, new OpenIdConnectConfigurationRetriever(),
    new HttpDocumentRetriever(httpClient) { RequireHttps = options.RequireHttpsMetadata });

您可以在之前显式设置配置管理器,以使该代码不会运行。这样,您可以提供自己的实现或正确授权其请求的HttpClient

如果您查看代码,则还有一个BackchannelHttpHandler。这是HttpClientHandler,用于反向信道通信。反向通道请求是所有与授权机构通信的请求。因此,不仅是配置端点,还包括OAuth的userinfo端点之类的东西。由于JWT没有任何反向通道通信,因此在这种情况下您无需担心它,但是由于您也可以将其配置为例如OAuth,记住这一点很重要。

因此,使用该BackchannelHttpHandler,例如,您可以指定凭据:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(o =>
    {
        options.BackchannelHttpHandler = new HttpClientHandler()
        {
            UseDefaultCredentials = true,
        };

        // …
    });

如果您需要其他凭据(例如,使用Authorization HTTP标头),则还可以提供自己的DelegatingHandler,在将请求委派给普通HttpClientHandler之前添加HTTP标头。像这样:

public class AuthorizingHandler : DelegatingHandler
{
    private readonly string _headerValue;
    public AuthorizingHandler(HttpMessageHandler inner, string headerValue)
        : base(inner)
    {
        _headerValue = headerValue;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("Authorization", _headerValue);
        return base.SendAsync(request, cancellationToken);
    }
}
var innerHandler = new HttpClientHandler();
var headerValue = "Bearer foobar";
options.BackchannelHttpHandler = new AuthorizingHandler(innerHandler, headerValue);

另一种替代方法是仅使用JwtBearerOptions.Configuration直接提供配置。但是,当然,这需要您以其他方式将设置与权限同步,因此,它不是一个好选择。