Angular 5不会将身份验证Cookie发送回

时间:2018-08-02 21:46:07

标签: asp.net angular http session-cookies

我有一个Angular 5应用程序和一个ASP.net core 2.0 rest api。当它们都在本地主机上运行时,我的身份验证就可以了。我最近将其余api部署在另一台服务器上,突然我无法进行身份验证。我通过以下方式在服务器上启用了CORS:

app.UseCors(options =>
{    
    options.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials();
});

在Angular中,我设置了我的请求选项:

var headers: Headers = new Headers();
headers.append('Content-Type', 'application/json')

var requestOptions = new RequestOptions({
    headers: headers,
    withCredentials: true,
});

使用提琴手,我观看了登录POST请求,并看到响应中包含:

Set-Cookie: .AspNetCore.Identity.Application=CfD...;expires=Thu, 16 Aug 2018 21:25:02 GMT; path=/; samesite=lax; httponly

但是,重定向回到首页后,我发出了api请求,以查看用户是否已登录

 var url = this.runtimeConfig.getConfig().apiUrl + `api/Auth/IsUserLoggedIn/`;
 return this.http.get(url, requestOptions).toPromise().then(response => {
     return <BoolDTO>ServerMessages.deserialize(response);
 });

看着提琴手,这个GET请求不包含COOKIE标头,就像两个应用程序都在本地主机上一样。

更奇怪的是,如果我随后将URL http://<serverip>:<port>/api/Auth/IsUserLoggedIn/粘贴到浏览器的地址栏中,它会发送COOKIE标头,并说用户已登录。

是否需要做一些事情才能使Angular的http客户端存储和重新发送cookie?

1 个答案:

答案 0 :(得分:0)

好像是cookie上的samesite=lax设置。 “松懈”会限制这种情况似乎很奇怪,但是documentation for ASP.net's SameSiteMode.LAX说:

  

LAX-Cookie将与“相同站点”请求和“跨站点”顶级导航一起发送。

由于XHR请求不是顶级导航,因此不会发送cookie。解决方案是从ConfigureServices

的服务器上的cookie中删除SameSite。
services.ConfigureApplicationCookie(options =>
{
    options.Cookie.SameSite = SameSiteMode.None;
});

我应该提到,这样做会将您的网站打开到CSRF attacks,但是如果您希望将客户端前端托管在与REST API不同的服务器上,这似乎是唯一的方法。我可能会重做我的项目,以便将前端和后端托管在同一服务器上。