1

我正在使用 ajax 发布操作。在这个动作中,我用来HttpContext.User.Identity.Name获取用户 ID。根据用户 ID,我在数据库中获取与该用户 ID 相关的一些记录,并通过 json 类型返回该值。

有时会话已过期,在这种情况下,该HttpContext.User.Identity.Name值变为空。如果它为空或 null 它将抛出异常。

所以我需要空或空检查HttpContext.User.Identity.Name值,如果它是空或空我需要将它重定向到登录页面。

但是重定向操作在 ajax post 操作中不起作用。如何解决这个问题呢?

我需要授权 ajax 发布操作。任何人都可以为此提供解决方案吗?

问候,
卡蒂克。

4

1 回答 1

3

但是重定向操作在 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
    }
});
于 2012-05-16T11:55:48.757 回答