使用ASP.NET MVC的json请求的401响应代码

如何禁用AJAX / JSON请求的标准ASP.NET处理401响应代码(重定向到登录页面)?

对于网页是没问题的,但对于AJAX,我需要获得正确的401错误代码,而不是302/200的登录页面。

更新 :来自ASP.NET MVC的PM Phil Haack提供了几种解决方案 - http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot -want.aspx


如果HttpResponse.StatusCode设置为401,但仅在找到Web.config的<authentication />部分时才开发ASP.NET运行时,以便始终将用户重定向。

删除身份验证部分将要求您实现重定向到属性中的登录页面,但这不应该是一个大问题。


在传统的ASP.NET中,当使用Ajax调用WebMethod时,您会得到一个401的http响应代码。 我希望他们会在将来的ASP.NET MVC版本中改变它。 现在我正在使用这个黑客:

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302 && Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}

我希望这两个表单身份验证,并返回一个401未经过身份验证的Ajax请求。

最后,我创建了一个自定义的AuthorizeAttribute并修饰了控制器方法。 (这是在.Net 4.5上)

//web.config

<authentication mode="Forms">
</authentication>

//控制器

[Authorize(Roles = "Administrator,User"), Response302to401]
[AcceptVerbs("Get")]
public async Task<JsonResult> GetDocuments()
{
    string requestUri = User.Identity.Name.ToLower() + "/document";
    RequestKeyHttpClient<IEnumerable<DocumentModel>, string> client =
        new RequestKeyHttpClient<IEnumerable<DocumentModel>, string>(requestUri);

    var documents = await client.GetManyAsync<IEnumerable<DocumentModel>>();

    return Json(documents, JsonRequestBehavior.AllowGet);
}

// authorizeAttribute

public class Response302to401 : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new JsonResult
                {
                    Data = new { Message = "Your session has died a terrible and gruesome death" },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
                filterContext.HttpContext.Response.StatusCode = 401;
                filterContext.HttpContext.Response.StatusDescription = "Humans and robots must authenticate";
                filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
            }
        }
        //base.HandleUnauthorizedRequest(filterContext);
    }
}
链接地址: http://www.djcxy.com/p/12437.html

上一篇: 401 response code for json requests with ASP.NET MVC

下一篇: Abort Ajax requests using jQuery