使用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