невозможно получить доступ к файлам cookie в ответе об отдыхе

0

У меня угловой передний конец с задним концом webapi. Я реализовал защиту OAuth v2 с использованием токенов OWIN/Identity и JWT (благодаря блогам Taiseer Joudeh). Мое бремя состоит в том, что у нас все еще есть старые страницы, требующие определенного файла cookie. Я добавил Http Response из WebApi, чтобы включить этот файл cookie, когда токен JWT возвращается из запроса на вход. Я проверил, что файл cookie находится в заголовке ответа.

Моя проблема в том, что я не могу видеть файл cookie внутри моего обработчика углового ответа, где я буду нажимать его в браузере. Я пробовал каждый из следующих вариантов, основанный на предложениях, которые я нашел в другом месте в StackOverflow, но пока что видимость файла cookie в коде.js ускользнула от меня (альтернативные попытки были закомментированы, но оставлены для полноты). Я также удостоверился, что я установил соответствующие поля "allow" на сервере, добавив "End-Control-Allow-Headers" в "set-cookie" и "Access-Control-Allow-Credentials" в "true" в конце моего метода ValidateClientAuthenticationContext (..).

Что мне нужно сделать, чтобы увидеть прикрепленный файл cookie в своем ответе на webapi? Это проблема на сервере или клиенте? и то и другое?

в файле authService.js:

var _login = function (loginData) {

    // this makes the data "form data"
    var data = "grant_type=password&client_id=ngAuthApp&username=" + loginData.userName + "&password=" + loginData.password;

    var deferred = $q.defer();

    $http.post(serviceBase + 'oauth/token', data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
        .success(function (response) {

            localStorageService.set('authorizationData', { token: response.access_token, userName: loginData.userName });

            _authentication.isAuth = true;
            _authentication.userName = loginData.userName;

                console.log($cookies);

            //var xxx = $http.defaults.headers;
            //var headers = $http.response.headers;

            var ddc = $http.response.cookies;
            $cookies.DDC = ddc;

            deferred.resolve(response);

        })
        //.success(function (data, status, headers, config) {
        //    // any required additional processing here 
        //    var results = [];
        //    results.data = data;
        //    results.headers = headers();
        //    results.status = status;
        //    results.config = config;

        //    deferred.resolve(results);
        //})
        .error(function (err, status) {
            _logOut();
            deferred.reject(err);
        });

    return deferred.promise;

};

в моем обычном файле OAuthProvider.cs

public override Задача ValidateClientAuthentication (OAuthValidateClientAuthenticationContext контекст) {//пропускаем много кода здесь

        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "authorization", "content-type", "set-cookie" });

        context.Validated();
        return Task.FromResult<object>(null);
    }
Теги:
cookies
asp.net-web-api
oauth
owin

3 ответа

-1
Лучший ответ

Оказывается, ошибка была в моих предположениях. Я ожидал, что cookie, отправленный через веб-службу непосредственно из встроенного js-кода, будет игнорироваться браузером. Однако заголовок ответа имеет значение "Set-Cookie" в заголовке, а браузер IS уже подталкивает его к остальным куки. Я действительно этого не ожидал.

Я должен добавить, что это был очень полезный вопрос для меня, потому что он многому научил меня веб-программированию и тому, как браузер работает с значениями заголовка HTTP. Я ценю все время!

Маркус

2

Согласно документам - см. Здесь

$http.post() возвращает HttpPromise будущего HttpPromise. Ваш вызов.post() возвращает обещание. Что соответствует Уведомлению об изъятии на указанной выше странице:

$ Http legacy обещает, что методы успеха и ошибки устарели. Вместо этого используйте стандартный метод. Если для параметра $ httpProvider.useLegacyPromiseExtensions установлено значение false, то эти методы будут вызывать ошибку $ http/legacy.

Поэтому вместо.success()/error(), используйте это: (Скопировано из документов)

$http.post()
.then(function successCallback(response) {
  // this callback will be called asynchronously
  // when the response is available
}, function errorCallback(response) {
  // called asynchronously if an error occurs
  // or server returns response with an error status.
});

Кроме того, если вы еще не пробовали это (в соответствии с вызовом.post() он не отображается), установите свойство responseType вашего object конфигурации $http. Это задает datatype возвращаемого объекта response. В противном случае возвращается default по default для DOM string. Это может не исправить, но это может быть началом.

Это может также потребоваться с помощью свойства withCredentials. Протестируйте их и посмотрите, как это происходит. Идея исходит из предложения bastijn.

  • 0
    Отличный ответ! Я многому научился от этого! В частности, переключившись на «обещанную» версию, я смог получить «ответ», включающий как заголовок запроса, так и данные. В версии «.success» значение в «ответе» было просто данными. Это, как говорится, я все еще не в состоянии cookie изнутри углового кода.
0

Ваш вызов $ http также должен установить флаг withCredentials в true, чтобы явно разрешить совместное использование файлов cookie.

$http.post(url, {withCredentials: true, ...})

Флаг withCredentials позволяет javascript получать доступ к аутентифицированному сеансу пользователя.

//edit Теперь, когда я снова прочитаю ваш вопрос, это, вероятно, не ваша проблема. Параметр withCredentials должен передать ваш сеанс серверу на следующий запрос, который требуется для проверки подлинности. Из вашего вопроса кажется, что вы хотите проверить в js-коде, что проверенный вами файл cookie также доступен по коду.

  • 0
    да, я просто хочу получить доступ к куки в ответе от логина. Тем не менее, я пошел дальше и добавил ваше предложение, чтобы убедиться, что это не было исправлением, и, к сожалению, я убедился, что проблема остается. спасибо за попытку
  • 0
    Да. Это понадобится вам только для ваших будущих запросов, которые вам нужно сделать там, где требуется авторизованный сеанс.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню