Asp.Net Core Authentication 过滤器自定义 ajax 请求行为

问题描述

我有一个 ASP.NET Core 5 MVC 应用程序,它使用带有 CookieAuthentication 的 Active Directory。

它是这样设置的:

public void ConfigureServices(IServiceCollection services) 
{
    services.AddMvc(config => {
        // Requiring authenticated users on the site globally
        var policy = new AuthorizationPolicyBuilder()
                           .RequireAuthenticatedUser()
                           .Build();
        config.Filters.Add(new Authorizefilter(policy));
    })
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix,options => options.ResourcesPath = "Resources")
        .AddDataAnnotationsLocalization();

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options => {
             options.Cookie.Name = cookiesConfig.CookieName;
             options.LoginPath = cookiesConfig.LoginPath;
             options.logoutPath = cookiesConfig.logoutPath;
             options.AccessDeniedpath = cookiesConfig.AccessDeniedpath;
             options.ReturnUrlParameter = cookiesConfig.ReturnUrlParameter;
             options.ExpireTimeSpan = TimeSpan.FromSeconds(cookiesConfig.TokenExpireInSeconds);
             options.SlidingExpiration = true;
        });

    // policies are added in the account controller,after a valid login
    services.AddAuthorization(options => {
        options.AddPolicy("Require.Ldap.User",policy =>
            policy.RequireClaim("ENABLED_USER","true")
                  .AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme)
        );
    });
}

在控制器中,我使用标准的 [Authorize] 装饰器:

[Authorize(Policy = "Require.Ldap.User",AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]

现在,所有这些都非常有效,如果您未经授权,它会将您发送回登录页面,直到我开始处理 ajax 请求和自定义组件。

我正在使用 DevExpress 组件,它提供弹出窗口、网格和其他东西。

这个组件的问题在于它们没有提供任何方式来处理 xhr 请求结果(401、500、503 等,除非您完全在 javascript 中初始化它们,这不是我们的目的,因为我们正在使用他们的 MVC用于构建 UI 的 Fluent Helpers)。

让我们假设用户登录到应用程序然后离开 30 分钟并且令牌已过期。

因此,例如,如果我有一个按钮可以打开带有一些网格或表单的 Devexpress 弹出窗口,并且它们发出 ajax 请求以获取数据(即网格:获取记录列表,表单:获取组合框的记录)这是表单的一部分)但会话已过期,组件崩溃了,我可以捕获错误,但我无法获得任何信息(无论是 401 未授权还是 500 内部服务器错误,或者只是一个 js 错误) 但我最多只能显示错误,因为我无法确定它是否是未经授权的请求。

正确的行为是,如果组件执行 401 未经授权,它会将您重定向登录。但这不会发生,弹出窗口或任何组件只是挂在那里而不提供反馈。

现在,我正在考虑覆盖 AuthenticationFilter重定向任何未经授权的登录请求,但我什至不知道这是否是正确的解决方案。

你能告诉我在 ASP.NET Core 中如何覆盖授权以捕获 401 并强制重定向吗?

或者您有更好的解决方案吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)