【发布时间】:2019-07-07 20:50:37
【问题描述】:
在与我的 API 不同的端口上运行我的 Angular 6 应用程序时,我无法让 Google Chrome 将 AspNetIdentity 身份验证 cookie 作为请求的一部分发送。我已经通过在 API 端口(当前:4213)上以缩小版本托管应用程序来测试身份验证,它工作得很好。我在 :4200 上的 Angular 应用程序收到了 cookie;它在 F12 DevTools 中可见;它不会将其作为 GET 请求的一部分发送。
我的管道的相关部分:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme);
//skipping Identity stuff, but it's there
services.ConfigureApplicationCookie(options =>
{
//options.IdleTimeout = TimeSpan.FromSeconds(10); // for testing only
options.Cookie.HttpOnly = true; // prevent JavaScript access
options.Cookie.Expiration = TimeSpan.FromDays(150); // half a year?
options.Cookie.SameSite = SameSiteMode.None;
}
services.AddCors(options => {
options.AddPolicy(StartupConfiguration.AllowCredentials, builder => {
builder.WithOrigins("https://localhost:4213", "https://localhost:4200")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseCors(StartupConfiguration.AllowCredentials);
app.UseCookiePolicy(new CookiePolicyOptions {
MinimumSameSitePolicy = SameSiteMode.None
});
// Again, skipping ASP.NET Identity configuration, but it's there.
}
StartupConfiguration.AllowCredentials 只是一个返回字符串“AllowCredentials”的静态字段(我鄙视魔术字符串)。
身份验证方法几乎与此问题完全无关,因为它们工作得很好,但对于好奇的人来说,they can be found here。
家务:
This question外观相似,但问题不同;我得到了 cookie 就好了,但是浏览器没有发送它。
This question 的答案似乎暗示我根本不应该遇到这个问题,因为唯一涉及的域是 localhost。不过,我是。
This question 很有帮助,但我已经从 cookie 的 SameSite 字段中删除了 Lax 属性,但我仍然遇到同样的问题。
问题说明:
通过dotnet run 在 :4213 上启动应用程序。导航到我的应用程序的 /welcome 路线。点击登录。我被重定向到托管在同一端口上的登录页面。我登录了,成功了,我又被重定向到/welcome路由了,但是这次它看到我登录了。我的浏览器里有一个cookie:
...在对服务器的后续请求中,会自动发送该 cookie。
好的;所以,我打开一个新终端并运行
ng serve --host 0.0.0.0 --ssl true --ssl-key ./ssl/server.key --ssl-cert ./ssl/server.crt --configuration local-dev
...启动相同的应用程序,使用相同的代码,可通过 :4200 使用与 .NET Core 应用程序相同的协议进行浏览。我删除了 cookie,只是为了好玩(但这没关系,因为即使我保留了 cookie,它也不起作用)。 :4200/welcome -> :4213/id/login -> :4200/welcome(登录)。我现在有我刚刚删除的同一个 cookie,但是当/welcome 屏幕尝试通过点击 Authorize 方法(参见上面的链接)来确定它是否已登录时,它不会发送cookie!
简而言之,即使我收到了 cookie,并且正在设置它,我的浏览器也不会发送它。我也试过 Safari。根据其他问题中的信息,我不明白为什么会遇到这个问题。任何帮助将不胜感激。
为了清楚起见,我的问题是:
如何让我的浏览器发送通过不同端口接收的 cookie,而不是在同一主机上运行的应用程序但另一个端口?
谢谢。
【问题讨论】: