我有一个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?
答案 0 :(得分:0)
好像是cookie上的samesite=lax
设置。 “松懈”会限制这种情况似乎很奇怪,但是documentation for ASP.net's SameSiteMode.LAX说:
LAX-Cookie将与“相同站点”请求和“跨站点”顶级导航一起发送。
由于XHR请求不是顶级导航,因此不会发送cookie。解决方案是从ConfigureServices
services.ConfigureApplicationCookie(options =>
{
options.Cookie.SameSite = SameSiteMode.None;
});
我应该提到,这样做会将您的网站打开到CSRF attacks,但是如果您希望将客户端前端托管在与REST API不同的服务器上,这似乎是唯一的方法。我可能会重做我的项目,以便将前端和后端托管在同一服务器上。