ASP.NET跨子域Cookie未附加到请求

ASP.NET跨子域Cookie未附加到请求,asp.net,iis,cookies,Asp.net,Iis,Cookies,我一直在尝试构建一个本地的概念验证,以将我们当前的解决方案转移到一个不同的URL结构。我将ASP.NET与3个项目一起使用,这些项目当前映射了以下URL: mysite.com mysite.com/api mysite.com/app 为了设置概念验证,我在IIS中本地设置了3个站点,其中包含以下URL: mysite.com api.mysite.com app.mysite.com 并已将以下条目添加到主机文件中: 127.0.0.1 mysite.com 127.0.0.1 app.

我一直在尝试构建一个本地的概念验证,以将我们当前的解决方案转移到一个不同的URL结构。我将ASP.NET与3个项目一起使用,这些项目当前映射了以下URL:

mysite.com
mysite.com/api
mysite.com/app
为了设置概念验证,我在IIS中本地设置了3个站点,其中包含以下URL:

mysite.com
api.mysite.com
app.mysite.com
并已将以下条目添加到主机文件中:

127.0.0.1 mysite.com
127.0.0.1 app.mysite.com
127.0.0.1 api.mysite.com
当前,
app.mysite.com
api.mysite.com
对话以执行用户登录,这将在响应中返回cookie。问题是cookie没有存储在
mysite.com
下。对
api.mysite.com
的后续请求没有在请求头中附加cookie,因此失败

我尝试过设置cookie的
属性,但没有成功,也没有包括域属性

请求中返回的cookie示例:

Set-Cookie: MyCookie=somestuff; domain=.mysite.com; expires=Sat, 06-Sep-2014 00:02:04 GMT; path=/; HttpOnly
然而,cookie从未附加到任何对
api.mysite.com
的请求中,我也无法在Chrome、Firefox、IE等浏览器的cookie浏览器中看到它

请注意,我已经在web.config中启用了CORS以启用跨域请求

编辑: 作为对奥文回答的回应。我将进一步澄清我当前的设置

关于
我创建了一个machineKey,并在
web.config
文件中的两个应用程序上使用了相同的值。当使用
mysite.com/api
mysite.com/app
时,这已经在本地和生产中起作用了。直到转到子域,我才遇到这个问题

以下是我创建和附加cookie的代码:

        private void EncryptAndAttachCookieToHeaders(FormsAuthenticationTicket ticket)
        {

            string encryptedTicket = FormsAuthentication.Encrypt(ticket);

            HttpCookie newCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            newCookie.Domain = ".mysite.com";
            newCookie.Expires = DateTime.Now.AddMonths(3);
            newCookie.HttpOnly = true;
            newCookie.Secure = false; 

            System.Web.HttpContext.Current.Response.Cookies.Add(newCookie);

        // For testing purposes
        HttpCookie hc = new HttpCookie("cookie1", "value");
        hc.Domain = ".mysite.com"; 
        hc.Expires = DateTime.Now.AddMonths(3);
        HttpContext.Current.Response.Cookies.Add(hc);

        HttpCookie hd = new HttpCookie("cookie2", "value");
        hd.Domain = ".api.mysite.com"; 
        hd.Expires = DateTime.Now.AddMonths(3);
        HttpContext.Current.Response.Cookies.Add(hd);

在Fiddler中查看响应时,所有这些cookie(真实的一个加上两个测试)都是可见的。但是,对
api.mysite.com
的后续请求在请求头中没有附加任何cookie。既然我已移动到子域结构,浏览器似乎不想存储cookie。

要使跨域登录正常工作,首先需要编辑web.config中的
元素

默认情况下是这样的

<machineKey
    validationKey="AutoGenerate,IsolateApps"
    decryptionKey="AutoGenerate,IsolateApps"
    validation="SHA1"
    decryption="Auto" />

这应该是使跨域Cookie正常工作所需的一切

我找到了答案。问题实际上在于AJAX请求是如何形成的。我必须添加一个名为
withCredentials
的AJAX属性,以允许浏览器发送跨域cookie。这种方法的一个缺点是IE9和更早版本不支持它

发信人:

在api上设置允许凭据标头

Access-Control-Allow-Credentials: true
与请求的凭据一起使用

$.ajax({
    url: a_cross_domain_url,
    xhrFields: { 
        withCredentials: true 
    }
});
否则,
XMLHttpRequest
将不会发送cookie,无论
Access Control Allow Credentials
头如何

删除访问控制允许原点上的通配符

Access-Control-Allow-Origin: http://www.example.com

通配符
*
将不起作用。如果设置了带凭据的
浏览器将放弃响应。

谢谢您的回答。我编辑了我的问题,以解决你提出的问题。
$.ajax({
    url: a_cross_domain_url,
    xhrFields: { 
        withCredentials: true 
    }
});
Access-Control-Allow-Origin: http://www.example.com