ASP.NET身份Cookie未在子域中保存/设置

时间:2017-07-20 22:58:11

标签: c# authentication cookies asp.net-identity

编辑以添加额外的详细信息。

我有一个我有效用作授权服务器的Web项目(例如example.com)。然后,我有一些网站作为子域(例如sub1.example.com,sub2.example.com)。登录授权服务器时,我目前无法获取.AspNet.Cookies cookie以保存在子域中。我可以看到cookie在响应中回来但它没有被设置。

我搜索并尝试了各种解决方案,例如设置CookiePathCookieDomain。我已在所有网站的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
});

1 个答案:

答案 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