Несколько схем аутентификации в ASP.NET Core - PullRequest
0 голосов
/ 09 апреля 2019

Вернувшись в ASP.NET Core 1, аутентификация будет вручную подключена к конвейеру запросов при его конфигурации: для пользовательского процесса аутентификации вы просто определите AuthenticationMiddleware и подключите его к вашему конвейеру в точке, где происходит аутентификация. должно было случиться.

В ASP.NET Core 2 больше нет AuthenticationMiddleware, и вы должны сделать UseAuthentication() в некоторой точке конвейера, где обязательно должна выполняться вся аутентификация.

Здесь задокументирована разница: https://docs.microsoft.com/en-us/aspnet/core/security/authorization/limitingidentitybyscheme

Чтобы различать разные способы аутентификации, существуют политики, идентифицируемые по магическим строкам (множество магических строк в ASP.NET Core).

Затем мне говорят, что я могу выбрать желаемую схему с атрибутами на моем контроллере, но я не использую MVC вообще в рассматриваемом сценарии. Так как мне указать для конкретной ветки конвейера:

    app.UseWhen(c => ..., app2 =>
    {
        // auth number 1 desired

        ...
    });

    app.UseWhen(c => ..., app2 =>
    {
        // auth number 2 desired

        ...
    });

И даже в MVC аутентификация происходит до маршрутизации, так как информация о том, какую схему использовать, возможно, будет доступна в точке UseAuthentication() в конвейере?

1 Ответ

2 голосов
/ 09 апреля 2019

Вы можете выбрать конкретную схему аутентификации, используя обязательный подход, позвонив по номеру AuthenticateAsync. Вот пример:

app2.Use(async (ctx, next) =>
{
    var authenticateResult = await ctx.AuthenticateAsync("SchemeName");

    if (!authenticateResult.Succeeded)
    {
        ctx.Response.StatusCode = 401; // e.g.
        return;
    }

    // ...
});

AuthenticateAsync принимает схему аутентификации в качестве аргумента и возвращает экземпляр AuthenticateResult, который указывает на успех или неудачу через Succeeded и предоставляет аутентифицированную ClaimsPrincipal через Principal.

Вы также можете выполнить авторизацию для определенной политики, используя IAuthorizationService. Вот пример того, как Principal из AuthenticateResult может быть передано через AuthorizeAsync:

var authorizationService = ctx.RequestServices.GetService<IAuthorizationService>();
var authorizationResult = await authorizationService.AuthorizeAsync(
    authenticateResult.Principal, "PolicyName");

if (!authorizationResult.Succeeded)
{
    ctx.Response.StatusCode = 403; // e.g.
    return;
}

// ...

Как и в случае AuthenticateResult, AuthorizationResult указывает на успех или неудачу с помощью Succeeded - он также предоставляет информацию о том, почему авторизация не удалась с помощью Failure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...