编辑以添加额外的详细信息。
我有一个我有效用作授权服务器的Web项目(例如example.com)。然后,我有一些网站作为子域(例如sub1.example.com,sub2.example.com)。登录授权服务器时,我目前无法获取.AspNet.Cookies
cookie以保存在子域中。我可以看到cookie在响应中回来但它没有被设置。
我搜索并尝试了各种解决方案,例如设置CookiePath
和CookieDomain
。我已在所有网站的Web.config
文件匹配中验证了计算机密钥。这是我目前启用Cookie身份验证的方式:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
LoginPath = new PathString("/Account/Login"),
CookieDomain = ".example.com",
});
我在授权服务器上启用了CORS,并且当我登录时能够收到Bearer令牌,我似乎无法保存cookie。
提前致谢。
编辑:我在某处读到ARRAffinity cookie可能会弄乱事情,所以我也禁用了它。我仍然无法在子域中看到cookie。
编辑2:根据评论中的要求添加ajax调用(密码和域名已被更改以与帖子保持一致):
$.ajax({
url: 'https://example.com/auth/token',
method: 'POST',
data: {
grant_type: 'password',
username: 'admin@example.com',
password: '************'
},
crossDomain: true
});
答案 0 :(得分:1)
我打算在这里解答答案。
默认情况下,在进行跨站点ajax请求时,浏览器会忽略cookie。有关此here的更多信息。
要允许使用Cookie,您必须在请求中将withCredentials
设置为true
,如此(更多信息here):
$.ajax({
url: 'https://example.com/auth/token',
method: 'POST',
data: {
grant_type: 'password',
username: 'admin@example.com',
password: '************'
},
crossDomain: true,
xhrFields: {
withCredentials: true
}
});
我已在本地对此进行了测试,如果您需要的唯一方法是使用example.com
进行身份验证,然后在与sub1.example.com
进行交互时继续使用Cookie,那么这应该足够了。
如果您还希望使用Cookie向example.com
发出请求,并且不希望浏览器忽略您的回复,那么根据this link,您应该确保example.com
也返回标题Access-Control-Allow-Credentials: true
。