Веб-безопасность в 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.

Итак, мой вопрос и совет: вы тестируете на одной машине? Попробуйте развернуть его на машине с веб-сервером с уникальным доменным именем и протестировать ваше приложение!