【发布时间】:2014-10-29 21:10:52
【问题描述】:
我一直在尝试构建本地概念验证,以将我们当前的解决方案转移到不同的 URL 结构。我正在将 ASP.NET 与 3 个项目一起使用,这些项目当前已将这些 URL 映射到它们:
mysite.com
mysite.com/api
mysite.com/app
为了设置概念验证,我在 IIS 中使用以下 URL 本地设置了 3 个站点:
mysite.com
api.mysite.com
app.mysite.com
并已将以下条目添加到 HOSTS 文件中:
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 的 domain 属性,但没有成功,也没有包含域属性。
请求中返回的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>,我创建了一个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。
【问题讨论】: