ASP.NET跨子域Cookie未附加到请求
我一直在尝试构建一个本地的概念验证,以将我们当前的解决方案转移到一个不同的URL结构。我将ASP.NET与3个项目一起使用,这些项目当前映射了以下URL: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.
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