Веб-безопасность в IE VS Chrome и Firefox (ошибка)
Почему Web Security работает по-разному в разных браузерах:
Детали:
У меня есть два приложения
Один из них - это простое приложение HTML
, а другое - приложение ASP.NET MVC4 WebApi
, а проекты находятся внутри одного и того же решения, и я установил несколько стартовых проектов для запуска приложения за одно и то же время.
Рабочая версия:
Я использовал Web Security в проекте Web API. Я полностью выполнил веб-безопасность...
Код действия для входа
// GET api/company
[System.Web.Http.AcceptVerbs("Post")]
[System.Web.Http.HttpPost]
public HttpResponseMessage Login(LoginRequest loginRequest)
{
try
{
if (WebSecurity.Login(loginRequest.EmailAddress, loginRequest.Password, true))
{
var userDetails = new string[2];
userDetails[0] = loginRequest.EmailAddress;
var currentUSerRole = Roles.GetRolesForUser(loginRequest.EmailAddress);
userDetails[1] = currentUSerRole[0].ToString();
HttpResponseMessage response =
Request.CreateResponse(HttpStatusCode.Accepted, userDetails);
return response;
}
else
{
HttpResponseMessage response
= Request.CreateResponse(HttpStatusCode.Unauthorized);
return response;
}
}
catch (Exception e)
{
HttpResponseMessage response
= Request.CreateResponse(HttpStatusCode.Unauthorized);
return response;
}
}
*WebSecurity.Login*
работает во всех браузерах, когда я вызываю метод входа, используя Ajax
.
Но у меня есть другой метод в другом контроллере, который называется CurrentDateAndUser
Код:
[AllowAnonymous]
[System.Web.Http.AcceptVerbs("Get")]
[System.Web.Http.HttpGet]
public HttpResponseMessage CurrentDateAndUser()
{
if (WebSecurity.IsAuthenticated)
{
int userId = WebSecurity.CurrentUserId;
string[] currentDateAndUSerId = new string[2];
currentDateAndUSerId[0] = userId.ToString();
currentDateAndUSerId[1] = DateTime.UtcNow.ToString();
HttpResponseMessage response =
Request.CreateResponse(HttpStatusCode.Accepted, currentDateAndUSerId);
return response;
}
HttpResponseMessage responseNew =
Request.CreateResponse(HttpStatusCode.NotAcceptable);
return responseNew;
}
Проблема:
- Если я вызываю метод
CurrentDateAndUser
из Microsoft Internet Explorer. Используя вызов Ajax, все работает. WebSecurity.IsAuthenticated
возвращает true и работает хорошо.
Однако
- Если я вызываю метод
CurrentDateAndUser
из Google Chrome или Mozilla Firefox с помощью вызова Ajax, то ничего не работает. WebSecurity.IsAuthenticated
всегда возвращает false.
Я не знаю почему. Если у вас есть идеи, пожалуйста, дайте мне знать.
Я также нашел аналогичную проблему (не уверен, что это реальная проблема):
Когда я запускаю свое приложение с помощью Fiddler, я вижу другой результат:
Когда я вызываю метод CurrentDateAndUser
из IE, запрос:
![enter image description here]()
Я вижу значения Cooke/Login в изображении выше
Но когда я вызываю метод CurrentDateAndUser
из Chrome и Firefox, запрос:
![enter image description here]()
Я не вижу значения cookie, что означает, что свойство Web Security.IsAuthenticated
возвращает false
.
Это ошибка в WebSecurity
?????
Изменить
Мой код запроса Ajax
function GetCurrentUserId() {
return $.ajax({
method: 'GET',
url: rootUrl + '/api/Common/CurrentDateAndUser',
async: false
}).success(function (response) {
return response[0];
}).error(function () {
toastr.error('Somthing is wrong', 'Error');
})
}
Этот запрос не отправляет значения Cookie Auth методу Web API при запуске приложения в Chrome и Firefox, однако этот запрос отправляет значения cookie методу API, если он запущен в IE
Я разместил изображение, пожалуйста, взгляните на изображение выше.
Ответы
Ответ 1
Проблема заключается не в веб-безопасности вообще, а в том, как вы реализуете свою безопасность. Вы никогда не должны использовать идентификатор пользователя, адрес электронной почты или что-то важное в файлах cookie.
Я бы посоветовал вам использовать класс FormsAuthentication
для шифрования и дешифрования ваших файлов cookie, и даже при этом хранить только что-то вроде SessionID плюс пользовательский хэш этого идентификатора сеанса, чтобы проверить себя, когда вы расшифруете файл cookie
Вот сайт, который дает довольно хороший пример: http://www.c-sharpcorner.com/uploadfile/nipuntomar/update-formsauthenticationticket/
Ответ 2
В нем есть три вещи:
WebSecurity.IsAuthenticated фактически возвращает значение HttpRequest.IsAuthenticated, которое истинно, если cookie Forms Authentication был установлен и является текущим. Он недоступен, пока пользователь не сделает следующий запрос после успешного входа в систему, поэтому вы видите поведение, которое вы описываете.
Я помню, как читал MSDN или где-то еще, WebSecurity.IsAuthenticated не работает, пока страница не будет полностью загружена. Значение, если вы входите в систему на странице и в том же потоке кода вы проверяете IsAuthenticated, он НЕ вернет True. Для того, чтобы IsAuthenticated был True, страница должна быть перезагружена или использовать лучшую практику; который должен перенаправить пользователя на другую защищенную страницу, как только логин будет успешным, и на этой странице проверьте IsAuthenticated.
У нас была такая же проблема с Chrome (версия 21.0.1180). Несмотря на то, что мы видим дату истечения срока действия заголовка, некоторые Chrome в Windows XP проигнорировали его. Затем мы удалили дату истечения срока действия, и Chrome принял содержимое cookie сессии без проблем.
Итак, что делать:
После входа в систему попробуйте проверить это на новой странице не на одной странице.
Также попробуйте явно указать cookie
System.Web.Security.FormsAuthentication.SetAuthCookie(user.Username, false);
Ответ 3
Я не знаю, поможет ли это или нет.
Но я помню, что изучал jQuery ajax
Поэтому я настраиваю простой проект на своем ноутбуке. Когда я протестировал его, он отлично работал на IE, но не удался в Chrome. После поиска в течение нескольких часов я обнаружил, что Chrome не разрешает запросы AJAX с локальной машины. Когда я тестировал его с использованием реального веб-сервера, он отлично работал для IE и Chrome.
Итак, мой вопрос и совет: вы тестируете на одной машине?
Попробуйте развернуть его на машине с веб-сервером с уникальным доменным именем и протестировать ваше приложение!