我正在将ASP.NET Core 2.1与JwtBearer方案一起用于身份验证,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(o =>
{
// my options here
});
}
相当标准,但是我遇到的麻烦是我的令牌颁发机构发现端点需要授权才能访问。我需要做的是将基本身份验证标头注入到JWT中间件对我的权限终结点所做的请求中。我正在查看配置选项,但看不到任何允许我执行此操作的东西。我还在查看源代码,看是否可以看到在哪里发出了HTTP请求,但是通过抽象和扩展方法将其混淆了,但是我还没有找到它。
有人可以告诉我是否可以在某处设置此地址,还是我必须创建自己的授权处理程序并将其手动捆绑在一起?任何建议表示赞赏。
答案 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
直接提供配置。但是,当然,这需要您以其他方式将设置与权限同步,因此,它不是一个好选择。