5

当我返回 Unauthorized() 时,为什么我的 WebApi2 控制器将我重定向到登录页面?当我使用 [Authorize] 属性时也会发生同样的情况。控制器不应该按照 Content-Type 的要求返回 Json 或 XML 结果吗?将我重定向到登录页面是一种资源浪费,对应用程序客户端完全没有用处。

我环顾了网络似乎表单身份验证模块正在获取我的 401 响应并将其转换为 302。这很奇怪,因为我的身份验证模式是“无”(不是表单)。此外,我已经读到这个“功能”已经在.Net 4.5(我正在运行)中得到修复。

我尝试在 Global.asax.cs 中覆盖我的 Application_EndRequest

        protected void Application_EndRequest()
    {
        var context = new HttpContextWrapper(Context);
        // If we're an ajax request, and doing a 302, then we actually need to do a 401
        if (Context.Response.StatusCode == 302 && context.Request.ContentType.StartsWith("application"))
        {
            Context.Response.Clear();
            Context.Response.ClearContent();
            Context.Response.StatusCode = 401;
            context.Response.RedirectLocation = null;
            Context.Response.End();
        }
    }

它不能很好地工作(返回一个 IIS Html 页面)。你下一步怎么做 ?

4

1 回答 1

12

使用带有 Web API 和 401 响应代码的 cookie 身份验证中间件 您可以通过在 CookieAuthenticationProvider 中覆盖 OnApplyRedirect 事件来自定义它。阅读博客以获得进一步的解释。

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
   LoginPath = new PathString("/Account/Login"),
   Provider = new CookieAuthenticationProvider
   {
      OnApplyRedirect = ctx =>
      {
         if (!IsAjaxRequest(ctx.Request))
         {
            ctx.Response.Redirect(ctx.RedirectUri);
         }
     }
   }
});

在同一个班级:

private static bool IsAjaxRequest(IOwinRequest request)
{
   IReadableStringCollection query = request.Query;
   if ((query != null) && (query["X-Requested-With"] == "XMLHttpRequest"))
   {
      return true;
   }
   IHeaderDictionary headers = request.Headers;
   return ((headers != null) && (headers["X-Requested-With"] == "XMLHttpRequest"));
}
于 2013-11-07T19:55:52.550 回答