【问题标题】:Aspnet core cookie [Authorize] not redirecting on ajax callsAspnet 核心 cookie [授权] 不在 ajax 调用上重定向
【发布时间】:2020-02-29 00:19:53
【问题描述】:

在一个基于 cookie 授权的 asp.net core 3.1 web 应用程序中,我创建了一个自定义验证器,它在 cookie 授权的 OnValidatePrincipal 事件上执行。验证器会做一些事情,其中​​之一是在用户被阻止时检查后端。如果用户已被阻止,则执行 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);
    }

以下是基于 cookie 的授权设置:

    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();
            });

这实际上会按预期被调用和执行,并在用户被阻止后导航到新页面时将用户重定向到登录页面。

大多数视图都有对每 10 秒在计时器上执行的 api 方法的 ajax 调用。对于这些调用,凭据也会得到验证,并且用户会被注销。但是,在用户退出后,页面上会出现一个询问用户凭据的弹出窗口:

如果用户没有输入他们的凭据并导航到另一个页面,他们会按预期被带到登录页面。 如果他们确实输入了他们的凭据,他们会保持登录状态,但他们的身份似乎是他们的 Windows 身份...... 这里发生了什么?我真正想要实现的是,用户在退出后提出的任何请求都会被带到登录页面。

我显然错误地配置了一些东西,因此基于 cookie 的授权对于 ajax 请求不能正常工作,但我无法弄清楚它是什么。 还是 Authorization 属性没有按我预期的方式工作?

【问题讨论】:

    标签: asp.net-mvc authentication asp.net-core cookies


    【解决方案1】:

    代码行对我来说看起来不错。

    此登录对话框似乎是 Windows 身份验证的默认对话框。通常,它来自 launchSettings.json 文件中的 iisSettings。在 Visual Studio 中,您会在 Project > Properties > launchSettings.json 中找到后者

    将 windowsAuthentication 设置为 false。

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

    【讨论】:

    • 解决了这个问题,谢谢!看起来在没有 cookie 的情况下,身份验证恢复为 Windows 身份验证。
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多