我有JsonResult操作,需要身份验证和特殊角色
[Authorize(Roles = "User")]
public virtual JsonResult Cancel()
{
//...
}
但是当我注销并使用jQuery ajax点击此操作时,我可以看到状态代码是200,但它应该是401。
$.ajax({
url: "/Cancel/",
type: "POST",
dataType: "text",
cache: false,
success: function (data, textStatus, xhr) {
alert(xhr.status); //200 here when unauthorized
}
});
所以我真的无法执行控制器逻辑,因为它没有被授权,我在调试时检查过,但为什么我在jquery ajax中获取状态代码200?
更新:
在Fiddler中,它说的是状态代码 302 ,我可以看到/Acount/Login
请求后发出/Cancel
请求。
/Cancel - 302
/Acount/Login - 200
在Chrome网络状态代码:302找到,我也可以看到登录控制器(/Acount/Login
)在/Cancel
被调用后被调用。
/Cancel - 302
/Acount/Login - 200
Opera网络中的完整请求详细信息
有人可以解释发生了什么,为什么jquery没有得到正确的状态代码?
我想要做什么 - 想要获得正确的状态代码,如果是401
我想将用户重定向到登录页面(window.location.href = " /Acount/Login"
)
请求详情
POST /Cancel/ HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; en) Presto/2.9.168 Version/11.50
Host: localhost:999
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate
Referer: http://localhost:999/Action
Cookie: style=normalText; ASP.NET_SessionId=latzewpi3kqmkq4meljv0ln5
Connection: Keep-Alive
Content-Length: 0
Accept: text/plain, */*; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: text/xml; charset=utf-8
Content-Transfer-Encoding: binary
回复详情
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: /Account/LogOn?ReturnUrl=%2fCancel%2f
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 11 Aug 2011 03:04:53 GMT
Content-Length: 169
答案 0 :(得分:0)
FormsAuthentication
在其http模块中有处理程序,它会将所有401响应重定向到登录页面而不是错误页面。
查看FormsAuthenticationModule
的源代码应该(非常难看)解决方法 - 如果将ReturnUrl=/
附加到查询字符串,模块应该不进行重定向。
最好的解决方案可能是编写自己的http模块进行身份验证 - 您可以在反射器中打开FormsAuthenticationModule
并将其用作参考。