Авторизация с действием JsonReult jQuery ajax вернул код состояния 200, когда не авторизован - PullRequest
1 голос
/ 11 августа 2011

У меня есть действие 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
                }

});

Так что я действительно не могу выполнить логику контроллера, потому что она не авторизована, я проверил это при отладке, но почему я получаю код состояния 200 в jquery ajax?

ОБНОВЛЕНО:

В Fiddler говорится, что код состояния 302 , и я мог видеть, что запрос к /Acount/Login был сделан после /Cancel запроса.

/Cancel - 302
/Acount/Login - 200

В сети Chrome Код состояния: 302 Найдено , а также я мог видеть, что контроллер входа в систему (/Acount/Login) вызывается после вызова /Cancel.

/Cancel - 302
/Acount/Login - 200

Полная информация о запросе в Operaсеть

Может ли кто-нибудь объяснить, что происходит, почему jquery не получил правильный код статуса?

Действительно, что я хочу сделать - желание получить правильный код статуса, и если это 401я хочу перенаправить пользователя на лogin page (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

1 Ответ

0 голосов
/ 11 августа 2011

FormsAuthentication имеет в своем модуле http обработчик, который перенаправляет все ответы 401 на страницу входа вместо страницы ошибки.

Глядя на исходный код FormsAuthenticationModule, должен быть (довольно уродливый) обходной путь -если вы добавляете ReturnUrl=/ к строке запроса, модуль не должен перенаправлять.

Лучшее решение - написать собственный модуль http для аутентификации - вы можете открыть FormsAuthenticationModule в отражателе и использовать его в качестве ссылки.

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