【问题标题】:Issues with redirecting unauthorized requests based on whether it's an API call or not基于是否是 API 调用重定向未经授权的请求的问题
【发布时间】:2021-02-22 13:20:42
【问题描述】:

因此,当未登录用户尝试访问带有 [Authorize] 的 Razor 页面时,我的应用程序退出并显示代码 -1,073,741,571...

我正在使用 ASP.NET Core 5.0 RC1

Here's the complete log

这就是我认为它发生的地方:

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = new PathString("/login");
        options.LogoutPath = new PathString("/logout");
        options.AccessDeniedPath = new PathString("/login");
        options.Cookie.SameSite = SameSiteMode.Lax;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Events.OnRedirectToLogin = 
            HandleApiRequest(StatusCodes.Status401Unauthorized, options.Events.RedirectToLogin);
        options.Events.OnRedirectToAccessDenied =
            HandleApiRequest(StatusCodes.Status403Forbidden, options.Events.RedirectToLogin);
    });

这里是使用的助手:

    public static class RoutingHelpers
    {
        private const string ApiRoutePrefix = "/api";
        private static bool IsApiRequest(this HttpContext context)
        {
            if (context.Request.Path.StartsWithSegments(ApiRoutePrefix))
            {
                return true;
            }
        
            // Check if this is an ApiController
            var endpoint = context.GetEndpoint();
            return endpoint != null && endpoint.Metadata.Any(o => o is ApiControllerAttribute);
        }
        
        public static Func<RedirectContext<CookieAuthenticationOptions>, Task> HandleApiRequest(int statusCode, Func<RedirectContext<CookieAuthenticationOptions>, Task> original)
        {
            return redirectContext =>
            {
                if (!redirectContext.HttpContext.IsApiRequest()) 
                    return original(redirectContext);
                    
                redirectContext.Response.StatusCode = statusCode;
                return Task.CompletedTask;
            };
        }
    }

一般而言,此代码的目标是将 [Authorize]d API 请求重定向到其他位置,而不是 [Authorize]d Razor 页面,以避免 API 响应只是登录页面的整个 HTML 代码。

【问题讨论】:

    标签: .net asp.net-core authorization razor-pages


    【解决方案1】:
    options.Events.OnRedirectToLogin = 
            HandleApiRequest(StatusCodes.Status401Unauthorized, options.Events.RedirectToLogin);
        options.Events.OnRedirectToAccessDenied =
            HandleApiRequest(StatusCodes.Status403Forbidden, options.Events.RedirectToLogin);
    

    应该是

    options.Events.OnRedirectToLogin = 
            HandleApiRequest(StatusCodes.Status401Unauthorized, options.Events.OnRedirectToLogin);
        options.Events.OnRedirectToAccessDenied =
            HandleApiRequest(StatusCodes.Status403Forbidden, options.Events.OnRedirectToLogin);
    

    我猜会在 2 天内将其标记为已解决

    【讨论】:

      猜你喜欢
      • 2020-05-12
      • 2018-09-27
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2015-06-17
      • 2018-09-04
      相关资源
      最近更新 更多