如何在Json控制器操作中验证用户?

时间:2009-12-02 15:28:24

标签: asp.net-mvc json yui

我有一个.NET MVC控制器操作,它将JsonResult返回给YUI AsyncRequest回调。一切正常,AsyncRequest调用和“内容”模型数据已成功更新。我现在如何确保在进行AsyncRequest之前记录用户?

通常我会使用[Authorize]属性将错误返回给我的YUI AsyncRequest,因为它期待Json结果。

我也尝试过检查“User.Identity.IsAuthenticated”,但仍然没有爱.RedirectToRoute似乎什么也没做。

我已经能够将一个Json结果发送回JS,表明用户需要登录,但我宁愿让用户将用户重定向到LogOn视图。

以下是Controller操作:

[JsonFilter(Param="content"), JsonDataType=typeof(Content)]
public ActionResult SaveJson(Content content) 
{

    if (!User.Identity.IsAuthenticated)
        RedirectToRoute(new { Action="LogOn", Controller="Account"});


    contentRepository.Update(content);
    return Json(new {Result = "sucess"});

}

TIA!

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

[JsonFilter(Param="content"), JsonDataType=typeof(Content)]
public ActionResult SaveJson(Content content) 
{

    if (!User.Identity.IsAuthenticated)
    {
        var urlHelper = new UrlHelper(ControllerContext.RequestContext);
        return Json(new {Result = "unauthenticated" , Url = urlHelper.Action("LogOn", "Account")});
    }

    contentRepository.Update(content);
    return Json(new {Result = "sucess"});
}

您将使用urlHelper.Action(“LogOn”,“Account”)部分结果将位置更改为登录页面(window.location.href = ...)。

附加说明:您可以将urlHelper.Action(“LogOn”,“Account”)移动到您的视图中,作为回调函数的一部分。

答案 1 :(得分:1)

我认为语义上正确的做法是返回带有401(未授权)状态代码的HTTP响应,并让js决定如何响应。我不熟悉YUI,但在jQuery中你可以设置一个错误回调函数,就像这样...

function BasicJSONPost(urlToPost, dataToSend, onSuccess) {
$.ajax({
    url: urlToPost,
    data: dataToSend,
    dataType: "json",
    type: "POST",
    success: onSuccess,
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        HandleAjaxError(XMLHttpRequest, textStatus, errorThrown);
    }
});
}

function HandleAjaxError(XMLHttpRequest, textStatus, errorThrown) {
    if (XMLHttpRequest.status == 401) {
        window.location.href = '/account/login';
    }
}