Angular withCredentials не отправляет куки - PullRequest
9 голосов
/ 19 сентября 2019

Я использую Angular 8 со старым бэкэндом (ASP.NET MVC 5 Framework) НЕ CORE Я пытаюсь отправить куки-файлы веб-сайта, поэтому запрос от углового веб-сайта, который считается аутентифицированным

Я создал перехватчик для этого

import { HttpInterceptor, HttpHandler, HttpEvent, HttpRequest } 
from '@angular/common/http';
import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';

@Injectable()
export class TokenInterceptor implements HttpInterceptor {
  constructor() { }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const newRequest = request.clone({
      withCredentials: true,
    });
    return next.handle(newRequest);
  }

}

, вот код запроса

private getDefaultConfiguration(): configurationsType {
  return {
    observe: 'response',
    responseType: 'json',
    headers: new HttpHeaders().set('Content-Type', 'application/json')
  };
}

public async get(endpoint: string, params: HttpParams = undefined) {
  const options = this.getDefaultConfiguration();
  if (params !== undefined)
    options.params = params;

  const response: HttpResponse<object> = await this.http.get(endpoint, options).toPromise();
  return await this.errorCheck(response);
}

Я могу подтвердить, что перехватчик выполняется оператором console.logпроблема в том, что я не получаю куки в запросе (кстати, Http Get not Post), и мой запрос считается не прошедшим проверку подлинности.

Я использую следующий фильтр для проблемы CORS

public class AllowCrossSiteAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpResponseBase response = filterContext.RequestContext.HttpContext.Response;

        response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
        response.AddHeader("Access-Control-Allow-Headers", "*");
        response.AddHeader("Access-Control-Allow-Methods", "*");
        response.AddHeader("Access-Control-Allow-Credentials", "true");

        base.OnActionExecuting(filterContext);
    }
}

Я регистрирую фильтр глобально,

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AllowCrossSiteAttribute());
    }
}

вот файл cookie, который я ожидаю отправить в заголовке, этот фрагмент взят из метода входа в систему

var ticket = new FormsAuthenticationTicket(SessionHelper.DefaultSession().KullaniciAdi, model.RememberMe, timeout);
string encrypted = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted)
{
    Expires = DateTime.Now.AddMinutes(timeout),
    HttpOnly = true // cookie not available in javascript.
};

Response.Cookies.Add(cookie);

return RedirectToAction("Index", "Home");

и вот печенье в хроме

enter image description here, если вам нужна дополнительная информация, пожалуйста, спросите меня в комментарии, и я предоставлю это.

Обновление

  1. Я проверил эту статью и применил атрибут same-site set-cookie к none, но это все равно не решило проблему,

  2. Я обновил [AllowCrossSiteAttribute], чтобы это было похоже на это, из-за совершенно другой проблемы, которую я получал в угловом

public class AllowCrossSiteAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpResponseBase response = filterContext.RequestContext.HttpContext.Response;

        response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
        response.AddHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");
        response.AddHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
        response.AddHeader("Access-Control-Allow-Credentials", "true");

        base.OnActionExecuting(filterContext);
    }
}

В методе OnAuthorization, который существует в BaseController и который вызывается при каждом запросе, я протестировал заголовок запроса.если я запрашивал что-то из старого приложения MVC, я правильно получаю файлы cookie enter image description hereно когда я делаю запрос от углового проекта, я не получаю Cookies вообще

enter image description here

вот как файлы cookie появляются в Chrome Inspector

для углового проекта enter image description here

и для старого проекта MVC enter image description here

...