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 请求是在哪里发出的,但它通过抽象和扩展方法非常混乱,我还没有找到它。
有人能告诉我是否可以在某个地方设置它,或者我是否必须创建自己的授权处理程序并手动将它们绑定在一起?任何建议表示赞赏。
默认情况下,JwtBearer 身份验证方案将使用ConfigurationManager\xe2\x80\x99s 在 处公开的配置.well-known/openid-configuration。如果您没有通过设置JwtBearerOptions.ConfigurationManager属性显式配置实例,那么它会在您配置后自动创建一个实例:
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 });\nRun Code Online (Sandbox Code Playgroud)\n\n您可以之前显式设置配置管理器,以便此代码不会运行\xe2\x80\x99。这样,您就可以提供自己的实现或HttpClient正确授权其请求的实现。
如果你看一下代码,还有一个BackchannelHttpHandler. 这是HttpClientHandler用于反向通道通信的。反向渠道请求是指与当局沟通的所有请求;因此,不仅是配置端点,还包括 OAuth 的 userinfo 端点之类的内容。由于 JWT 没有任何反向通道通信,因此在这种情况下您无需担心它,但由于您也可以配置 OAuth 等,因此记住这一点很重要。
因此,使用它BackchannelHttpHandler,您可以指定凭据:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\n .AddJwtBearer(o =>\n {\n options.BackchannelHttpHandler = new HttpClientHandler()\n {\n UseDefaultCredentials = true,\n };\n\n // \xe2\x80\xa6\n });\nRun Code Online (Sandbox Code Playgroud)\n\n如果您需要其他凭据,例如使用AuthorizationHTTP 标头,那么您还可以提供自己的凭据DelegatingHandler,在将请求委托给正常的请求之前添加 HTTP 标头HttpClientHandler. 像这样的东西:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\nvar innerHandler = new HttpClientHandler();\nvar headerValue = "Bearer foobar";\noptions.BackchannelHttpHandler = new AuthorizingHandler(innerHandler, headerValue);\nRun Code Online (Sandbox Code Playgroud)\n\n另一种选择是直接使用JwtBearerOptions.Configuration. 但当然,这需要您以其他方式将设置与权限同步,因此它可能不是一个不错的选择。
| 归档时间: |
|
| 查看次数: |
5374 次 |
| 最近记录: |