Запретить и перенаправлять пользователя на другую страницу после входа в систему в ASP. NET Core - PullRequest
0 голосов
/ 25 февраля 2020

Я использую аутентификацию в ASP. NET Ядро с социальными провайдерами, использующими промежуточное ПО аутентификации ( нет Идентификация). Все работает со следующей конфигурацией:

services
    .AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.RequireAuthenticatedSignIn = false;
    })
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
    {
        options.LoginPath = "/login";
        options.LogoutPath = "/account/logout";
    })
    .AddGoogle(options =>
    {
        options.ClientId = "...";
        options.ClientSecret = "...";
        options.Events = new OAuthEvents
        {
            OnTicketReceived = ctx =>
            {
                ...
            }
        };
    });

При перенаправлении пользователя на вызов Google и его входе мой сайт успешно проходит проверку подлинности с помощью cook ie auth.

Теперь я Я хочу лучше контролировать то, что должно произойти, когда пользователь входит в систему. Я хочу проверить несколько требований в OnTicketReceived и запретить вход с использованием cook ie auth.

Рассмотрим код, подобный этому, для OnTicketReceived:

OnTicketReceived = ctx =>
{
    if (someRequirementNotMet)
    {
         // User should not be logged in and redirected to /login
         // CODE MISSING HERE!
    }

    if (someCondition)
    {
         // User should be logged in and redirected to /somepage
         ctx.ReturnUri = "/somepage";
         return Task.CompletedTask;
    }

    // User should be logged in and redirected to /someotherpage
    ctx.ReturnUri = "/someotherpage";
    return Task.CompletedTask;
}

Как бы мне этого добиться? Я пробовал это:

ctx.ReturnUri = "/login";
return Task.CompletedTask;

внутри первого if. Но пользователь входит в систему при перенаправлении на /login. Я также пытался позвонить ctx.HandleResponse(), но это просто приводит к пустому результату.

1 Ответ

0 голосов
/ 26 февраля 2020

Я понял, как это можно решить:

OnTicketReceived = ctx =>
{
    if (someRequirementNotMet)
    {
         // User should not be logged in and redirected to /login
         ctx.HandleResponse();
         ctx.Response.Redirect("/login");
         return Task.CompletedTask;
    }

    if (someCondition)
    {
         // User should be logged in and redirected to /somepage
         ctx.ReturnUri = "/somepage";
         return Task.CompletedTask;
    }

    // User should be logged in and redirected to /someotherpage
    ctx.ReturnUri = "/someotherpage";
    return Task.CompletedTask;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...