Пользовательский AuthenticationHandler не работает в Asp.Net Core 3 - PullRequest
0 голосов
/ 13 октября 2019

Я не уверен, происходит ли то же самое в Asp.Net core 2.2, но это происходит, когда я обновлялся до последней версии Asp.net Core 3. Итак, моя проблема в том, что я создал пользовательский AuthenticationHandler, как показано ниже:

public class PlatformAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public PlatformAuthenticationHandler(
        IOptionsMonitor<AuthenticationSchemeOptions> options, 
        ILoggerFactory logger, 
        UrlEncoder encoder,
        ISystemClock clock) 
        : base(options, logger, encoder, clock)
    {
    }

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        var sessionTokenStr = Request.Headers[Headers.SessionToken];
        var userTokenStr = Request.Headers[Headers.UserToken];

        if (string.IsNullOrEmpty(sessionTokenStr) ||
            Guid.TryParse(sessionTokenStr, out var sessionToken))
        {
            return AuthenticateResult.Fail("Session token should be present and in GUID format");
        }

        if (string.IsNullOrEmpty(userTokenStr) ||
            Guid.TryParse(userTokenStr, out var userToken))
        { 
            return AuthenticateResult.Fail("User token should be present and in GUID format");
        }
        //... and so on...
    }
}

В моем классе запуска я регистрирую аутентификацию, как показано ниже:

collection.AddAuthentication(PlatformScheme.HeaderScheme)
.AddScheme<AuthenticationSchemeOptions, PlatformAuthenticationHandler>(PlatformScheme.HeaderScheme, null);
collection.AddAuthorization();

, а также в методе Configure:

public void Configure(
    IApplicationBuilder app)
{
    app.UseDeveloperExceptionPage();
    app.UseMiddleware<ErrorHandlerMiddleware>();
    app.UseCors();
    //app.UseMiddleware<SessionBuilderMiddleware>();
    app.UseCoreFoundation();//custom library
    app.UseStaticFiles();
    app.UseStatusCodePages();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/PlatformApi/swagger.json", "Platform Api");
        c.RoutePrefix = "";
    });
}

У меня есть простое действие, как показано ниже:

[HttpGet(UrlPath + "claims")]
[Authorize]
public Task<IDictionary<string, object>> GetClaims(bool refresh)
{
    return _authenticationProvider.GetClaimsAsync(refresh);
}

Во время отладки я вижу, что я возвращаю AuthenticateResult.Fail("Session token should be present and in GUID format"); и в качестве следующего шага он входит в метод GetClaims. Почему это происходит? - Если я возвращаю ошибку из обработчика, разве это не должно помешать мне впоследствии получить доступ к методу?

1 Ответ

3 голосов
/ 13 октября 2019

Существует проблема с порядком вашего промежуточного программного обеспечения.

app.UseRouting();
app.UseCors();

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints => {
   endpoints.MapControllers();
});

UseAuthentication() и UseAuthorization() должны быть размещены после UseRouting() и до UseEndpoints(), как это описано в документах . .

...