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

The*_*hod 0 c# jwt .net-core asp.net-core

我使用 ASP.NET Core 2.1 和 JwtBearer 方案进行身份验证,如下所示:

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

非常标准,但是我遇到的问题是我的令牌权限发现端点需要授权才能访问。我需要做的是将基本身份验证标头注入到 JWT 中间件对我的权限端点执行的请求中。我正在查看配置选项,但没有看到任何允许我执行此操作的内容。我还在查看源代码,看看是否可以看到 http 请求是在哪里发出的,但它通过抽象和扩展方法非常混乱,我还没有找到它。

有人能告诉我是否可以在某个地方设置它,或者我是否必须创建自己的授权处理程序并手动将它们绑定在一起?任何建议表示赞赏。

pok*_*oke 7

默认情况下,JwtBearer 身份验证方案将使用ConfigurationManager\xe2\x80\x99s 在 处公开的配置.well-known/openid-configuration。如果您没有通过设置JwtBearerOptions.ConfigurationManager属性显式配置实例,那么它会在您配置后自动创建一个实例:

\n\n
var httpClient = new HttpClient(options.BackchannelHttpHandler ?? new HttpClientHandler());\nhttpClient.Timeout = options.BackchannelTimeout;\nhttpClient.MaxResponseContentBufferSize = 1024 * 1024 * 10; // 10 MB\n\noptions.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(options.MetadataAddress, new OpenIdConnectConfigurationRetriever(),\n    new HttpDocumentRetriever(httpClient) { RequireHttps = options.RequireHttpsMetadata });\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以之前显式设置配置管理器,以便此代码不会运行\xe2\x80\x99。这样,您就可以提供自己的实现或HttpClient正确授权其请求的实现。

\n\n

如果你看一下代码,还有一个BackchannelHttpHandler. 这是HttpClientHandler用于反向通道通信的。反向渠道请求是指与当局沟通的所有请求;因此,不仅是配置端点,还包括 OAuth 的 userinfo 端点之类的内容。由于 JWT 没有任何反向通道通信,因此在这种情况下您无需担心它,但由于您也可以配置 OAuth 等,因此记住这一点很重要。

\n\n

因此,使用它BackchannelHttpHandler,您可以指定凭据:

\n\n
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\n    .AddJwtBearer(o =>\n    {\n        options.BackchannelHttpHandler = new HttpClientHandler()\n        {\n            UseDefaultCredentials = true,\n        };\n\n        // \xe2\x80\xa6\n    });\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您需要其他凭据,例如使用AuthorizationHTTP 标头,那么您还可以提供自己的凭据DelegatingHandler,在将请求委托给正常的请求之前添加 HTTP 标头HttpClientHandler. 像这样的东西:

\n\n
public class AuthorizingHandler : DelegatingHandler\n{\n    private readonly string _headerValue;\n    public AuthorizingHandler(HttpMessageHandler inner, string headerValue)\n        : base(inner)\n    {\n        _headerValue = headerValue;\n    }\n\n    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n    {\n        request.Headers.Add("Authorization", _headerValue);\n        return base.SendAsync(request, cancellationToken);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n
var innerHandler = new HttpClientHandler();\nvar headerValue = "Bearer foobar";\noptions.BackchannelHttpHandler = new AuthorizingHandler(innerHandler, headerValue);\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一种选择是直接使用JwtBearerOptions.Configuration. 但当然,这需要您以其他方式将设置与权限同步,因此它可能不是一个不错的选择。

\n