Как я могу аутентифицировать пользователя в действии контроллера Json? - PullRequest
1 голос
/ 02 декабря 2009

У меня есть действие контроллера .NET MVC, которое возвращает JsonResult для обратного вызова YUI AsyncRequest. Все работает нормально с вызовом AsyncRequest, и данные модели «Содержимое» успешно обновляются. Как теперь я могу убедиться, что пользователь вошел в систему до создания AsyncRequest?

Обычно я бы использовал атрибут [Authorize], который возвращает ошибку обратно в мой YUI AsyncRequest, так как он ожидает результата Json.

Я также пытался проверить «User.Identity.IsAuthenticated» в действии, но по-прежнему не люблю.

Мне удалось отправить результат Json обратно в JS, который указал, что пользователю необходимо войти в систему, но я бы предпочел, чтобы он перенаправил пользователя в представление LogOn.

Вот действие контроллера:

[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"});

}

ТИА!

Ответы [ 2 ]

1 голос
/ 02 декабря 2009

Я думаю, что семантически правильная вещь - это вернуть HTTP-ответ с кодом состояния 401 (Unauthorized) и позволить 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';
    }
}
1 голос
/ 02 декабря 2009

Вы можете сделать что-то вроде:

[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") на ваше представление как часть вашей функции обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...