但是重定向操作在 ajax post 操作中不起作用。如何解决这个问题呢?
你可以从用[Authorize]
属性装饰你的控制器动作开始。这确保只有经过身份验证的用户才能访问它,并且保证 insideUser.Identity.Name
永远不会为空:
[Authorize]
public ActionResult SomeAction()
{
string username = User.Identity.Name; // this will never throw
...
return Json(...);
}
然后看看 Phil Haack 的以下博客文章。在其帖子中,Phil 提供了一个不错的插件,允许您将 ASP.NET 配置为在对受保护操作发出 AJAX 请求时发送 401 HTTP 状态代码。因此,在您的 jQuery 代码中,您可以很容易地检测到这种情况并重定向:
$.ajax({
url: '/SomeAction',
type: 'POST',
statusCode: {
200: function (data) {
alert('200: Authenticated');
// Bind the JSON data to the UI
},
401: function (data) {
// the user is not authenticated => redirect him to the login page
window.location.href = '/login';
}
}
});
当然,为了避免在所有 AJAX 请求中写入此 401 条件,您可以非常轻松地使用全局.ajaxError()
处理程序来集中处理所有 AJAX 请求的重定向逻辑,以防服务器返回 401 状态代码:
$(document).ajaxError(function(e, jqxhr, settings, exception) {
if (jqxhr.status == 401) { // unauthorized
window.location.href = '/login';
}
});
现在您的 AJAX 请求变得非常标准:
$.ajax({
url: '/SomeAction',
type: 'POST',
success: function(data) {
// do something with the data returned by the action
}
});