Как pnet core cook ie [Authorize] не перенаправляет на ajax вызовы - PullRequest
1 голос
/ 28 февраля 2020

В веб-приложении asp. net core 3.1 с авторизацией на основе cook ie я создал специальный валидатор, который выполняется при событии OnValidatePrincipal авторизации cook ie. Валидатор делает несколько вещей, одна из них - проверка в бэкэнде, был ли пользователь заблокирован. Если пользователь был заблокирован, выполняется метод CookieValidatePrincipalContext.RejectPrincipal(), и пользователь выходит из системы с использованием метода CookieValidatePrincipalContext.HttpContext.SignOutAsyn(...) согласно документам MS.

Вот соответствующий код для валидатора:

    public static async Task ValidateAsync(CookieValidatePrincipalContext cookieValidatePrincipalContext)
    {
        var userPrincipal = cookieValidatePrincipalContext.Principal;

        var userService = cookieValidatePrincipalContext.GetUserService();

        var databaseUser = await userService.GetUserBySidAsync(userPrincipal.GetSidAsByteArray());

        if (IsUserInvalidOrBlocked(databaseUser))
        {
            await RejectUser(cookieValidatePrincipalContext);

            return;
        }
        else if (IsUserPrincipalOutdated(userPrincipal, databaseUser))
        {
            var updatedUserPrincipal = await CreateUpdatedUserPrincipal(userPrincipal, userService);

            cookieValidatePrincipalContext.ReplacePrincipal(updatedUserPrincipal);
            cookieValidatePrincipalContext.ShouldRenew = true;
        }
    }

    private static bool IsUserInvalidOrBlocked(User user)
        => user is null || user.IsBlocked;

    private static async Task RejectUser(CookieValidatePrincipalContext context)
    {
        context.RejectPrincipal();

        await context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    }

А вот настройка для авторизации на основе cook ie:

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(co =>
            {
                co.LoginPath = @$"/{ControllerHelpers.GetControllerName<AuthenticationController>()}/{nameof(AuthenticationController.Login)}";
                co.LogoutPath = @$"/{ControllerHelpers.GetControllerName<AuthenticationController>()}/{nameof(AuthenticationController.Logout)}";
                co.ExpireTimeSpan = TimeSpan.FromDays(30);
                co.Cookie.SameSite = SameSiteMode.Strict;
                co.Cookie.Name = "GioBQADashboard";

                co.Events = new CookieAuthenticationEvents
                {
                    OnValidatePrincipal = UserPrincipalValidator.ValidateAsync
                };

                co.Validate();
            });

Это на самом деле вызывается и выполняется, как и ожидалось, и перенаправляет пользователя на страницу входа при навигации на новую страницу после блокировки.

Большинство представлений имеют ajax вызовов методов API, которые выполняются по таймеру каждые 10 секунд. Для этих вызовов также проверяются учетные данные, и пользователь выходит из системы. Однако после того, как пользователь вышел из системы, на странице появляется всплывающее окно с запросом учетных данных:

enter image description here

Если пользователь не вводит свои учетные данные и перейти на другую страницу, они будут приняты на страницу входа в систему, как и ожидалось. Если они вводят свои учетные данные, они остаются в системе, но их личность, по-видимому, является их windows личностью ... Что здесь происходит? Чего я действительно хотел бы добиться, так это чтобы пользователей перенаправляли на страницу входа для любого запроса, сделанного после их выхода.

Я явно что-то неправильно настроил, так что авторизация на основе cook ie не работает должным образом для ajax запросов, но я не могу понять, что это такое. Или это атрибут Authorization, который не работает так, как я ожидал?

1 Ответ

2 голосов
/ 28 февраля 2020

Строки кода выглядят хорошо для меня.

Похоже, что это диалоговое окно входа по умолчанию для Windows Аутентификация. Обычно это происходит из iisSettings в файле launchSettings. json. В Visual Studio вы можете найти последние в вашем Project> Properties> launchSettings. json

Там для windowsAuthentication установлено значение false.

{
  "iisSettings": {
    "windowsAuthentication": false,
   }
}
...