【问题标题】:ASP.net 5.0 - WebAPI Authorize & ErrorCode 302 instead of 401ASP.net 5.0 - Web API 授权 &ErrorCode 302 而不是 401
【发布时间】:2023-03-07 07:02:01
【问题描述】:

我有一个 ASP.net 5.0 (MVC 6) 网站,并且该网站也用于一些移动应用程序。我有一个返回 json 数据的控制器。

用户必须进行身份验证才能查看此数据,因此我使用控制器的 [Authorize] 属性。

我希望得到一个错误 401 未授权请求我得到一个重定向 (302) 到登录页面。 在移动客户端中,将标头设置为仅接受“application/json”数据,但我仍然会重定向到登录页面。

我开发了一个可行的解决方案,但我对它不是很满意。它有效,但它是一种 hack。

有没有更好的解决方案来处理这个问题?

这是我的解决方案(在 Startup 类中配置方法)

        //....Some Code
        app.Use(async (context, next) =>
        {
            await next.Invoke();

            if (context.Response.StatusCode == 302)
            {
                StringValues contentType;
                if (context.Request.Headers.TryGetValue("Accept", out contentType)
                    && contentType.Contains("application/json"))
                {
                    context.Response.StatusCode = 401;
                    if (env.IsDevelopment())
                        await context.Response.WriteAsync("No Access");
                }
            }
        });
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

【问题讨论】:

标签: c# asp.net asp.net-web-api asp.net-core-mvc


【解决方案1】:

这应该由客户解决。客户端必须发送一个X-Requested-With 标头,其值为XMLHttpRequest

所以这应该是 HTTP 请求中标头部分的一部分:

X-Requested-With: XMLHttpRequest

现在您将获得您的 401,而无需 hack。

【讨论】:

  • 这不适用于 dotnet core,您必须向您的身份验证中间件(例如 CookieAuthenticationMiddleware 或 OpenIdConnectMiddleware)添加自定义事件以检测 X-Requested-With: XMLHttpRequest 标头并自己返回 401。
  • 完美。这就是我一直在寻找的。谢谢。
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 2014-12-19
  • 2018-01-09
  • 2013-02-26
  • 2012-03-05
  • 2021-04-24
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多