我尝试学习ASPNetCore 2.2我不了解身份验证链的工作原理。
示例:Startup.cs
public void ConfigureServices(IServiceCollection services) {
services.AddMvcCore()
.AddAuthorization(); // Note 1
services.AddAuthentication(options => { // Note 2
options.DefaultAuthenticateScheme = ApiKeyAuthenticationOptions.DefaultScheme;
options.DefaultChallengeScheme = ApiKeyAuthenticationOptions.DefaultScheme;})
.AddJwtBearer(x => {
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = tvp;})
.AddApiKeySupport(options => { });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
app.UseStatusCodePages()
.UseResponseCompression()
//.UseAuthentication() // NOTE 3
.UseMvc();
}
ApiKeyHandler.cs
public class ApiKeyHandler : AuthenticationHandler<ApiKeyAuthenticationOptions>
protected override async Task<AuthenticateResult> HandleAuthenticateAsync() {
log.Debug("Checking API key");
// No API KeyProvided. Pass to next auth handler (JWT)
if (!Request.Headers.TryGetValue(ApiKeyHeaderName, out var apiKeyHeaderValues)) {
return AuthenticateResult.NoResult();
}
if (checkAuthHeader(foo)) {
ticket = createTicket(foo);
return AuthenticateResult.Success(ticket);
}
}
TestController.cs
[Authorize]
[ApiController]
public class TestApiController : Controller {
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + ApiKeyAuthenticationOptions.DefaultScheme)]
[HttpGet("api-jwt")]
public IActionResult APIAndJWT() {
var message = $"API and JWT !!! {nameof(APIAndJWT)}";
return new ObjectResult(message);
}
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[HttpGet("only-jwt")]
public IActionResult OnlyJWT() {
var message = $"JWT {nameof(OnlyJWT)}";
return new ObjectResult(message);
}
[Authorize(AuthenticationSchemes = ApiKeyAuthenticationOptions.DefaultScheme)]
[HttpGet("only-api")]
public IActionResult OnlyAPI() {
var message = $" API {nameof(OnlyAPI)}";
return new ObjectResult(message);
}
}
确定,TestApi非常简单。我想使用JWT身份验证或API密钥调用某些终结点。可以使用auth来调用其他端点。有三种方法。一种仅使用JWT身份验证,一种仅使用API身份验证,另一种可以使用JWT或API身份验证。我不知道这些方法如何工作:
嗯,没有AddAuthorization()似乎我的[Authorize]属性不会使用,因此我可以自由访问所有API。 BAD。在MSDN上,AddAuthorization()似乎启用了我不使用的策略。我必须使用AddAuthorization()来管理对API的简单访问?
AddAuthentication()很简单。它只是配置我的身份验证处理程序(JWT和自定义API处理程序)
UseAuthentication这是问题所在。我认为这样可以启用添加了AddAuthentication(...)//的中间件//注意2
我的问题:每个路由都创建一个新的ApiKeyHandler实例是正确的吗?例如,在路由/ only-jwt中,我仅指定JWT authschema,但始终创建/调用ApiKeyHandler。
REMOVING UseAuthentication()会执行相同的结果,即经过身份验证的路由,但在不需要时不会创建无用的ApiKeyHandler(/ only-jwt)。什么是正确的方法?
我认为AddMvc()/ AddAuthorization()-AddMvc / UseAuthentication()的顺序是正确的。
由我解决。
当您使用UseMvcCore()时需要AddAuthorization(),因为它不会自动像UseMVC()一样>
AspNetCore 2.2中存在一个错误
UseAuthentication()使用标准的身份验证管道,因此将创建每个AuthMiddleware并与其他链接。