Я использую 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");
и вот печенье в хроме
, если вам нужна дополнительная информация, пожалуйста, спросите меня в комментарии, и я предоставлю это.
Обновление
Я проверил эту статью и применил атрибут same-site
set-cookie
к none
, но это все равно не решило проблему,
Я обновил [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
но когда я делаю запрос от углового проекта, я не получаю Cookies вообще
вот как файлы cookie появляются в Chrome Inspector
для углового проекта
и для старого проекта MVC