【发布时间】:2019-08-21 07:40:48
【问题描述】:
我有一个 ASP.NET Core WebAPI (2.2),它使用 两种 类型的身份验证:
- JWTBearer
- APIKey(自定义)
这是我在 Startup.cs 中配置它的方式:
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddApiKeyAuthentication(options => Configuration.Bind("ApiKeyAuth", options));
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions =>
{
jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
jwtOptions.Events = new JwtBearerEvents
{
OnAuthenticationFailed = AuthenticationFailed
};
});
我的控制器装饰有Authorize 属性,包括这两种方案。因此,我可以使用不记名令牌或通过在标头中指定 API 密钥来调用我的 Web 方法 - 效果很好。
现在我添加了一个自定义中间件,在其中执行一些特定于租户的检查。我在Configure方法中注册了中间件(在UseAuthentication之后):
// ....
app.UseAuthentication();
app.UseMiddleware<CustomMiddleware>()
现在,如果我使用 bearer 身份验证调用 REST 方法,我的 CustomMiddleware 会被经过身份验证的用户调用 - 我可以 访问声明。
如果我使用我的自定义 APIKey 身份验证调用 same REST 方法,我的CustomMiddleware 会在我的AuthenticationHandler.HandleAuthenticateAsync() 方法之前调用之前。用户未经过身份验证 - 我无法访问声明(我自己在 HandleAuthenticateAsync 方法中填充声明)。
为什么在身份验证之前调用中间件?我怎样才能改变这种行为,以便在HandleAuthenticateAsync()之后调用中间件?
【问题讨论】:
-
JwtBearer 是否配置为默认认证方案?您的代码 sn-ps 未显示您如何设置默认方案。
-
@KirkLarkin 感谢您的帮助。我添加了我的确切配置。
-
对于有问题的 REST 方法,它是否是具有
[Authorize]属性的 MVC 操作。如果不是,那是什么?我意识到受影响的方法不止一种,但使用特定示例会更容易。 -
我的所有控制器都使用继承自
AuthorizeAttribute的 CustomeAuthorize 属性,并将AuthenticationSchemes设置为AuthenticationSchemes = "ApiKey,Bearer";
标签: c# asp.net-core .net-core