AspnetCore多重身份验证和AddAuthorization / AddAuthentication / UseAuthentication的使用

问题描述 投票:0回答:1

我尝试学习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()//注意1
  • AddAuthentication(...)//注意2
  • UseAuthentication()//注释3

嗯,没有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()的顺序是正确的。

c# authentication jwt authorization
1个回答
0
投票

由我解决。

  1. 当您使用UseMvcCore()时需要AddAuthorization(),因为它不会自动像UseMVC()一样>

  2. AspNetCore 2.2中存在一个错误

  3. UseAuthentication()使用标准的身份验证管道,因此将创建每个AuthMiddleware并与其他链接。

© www.soinside.com 2019 - 2024. All rights reserved.