ASP .NET跨站点表单身份验证在Dev中工作,但不在生产中

时间:2011-08-15 18:39:03

标签: asp.net-mvc-3 cookies forms-authentication

我有两个MVC3站点,它们都托管在我配置为使用相同身份验证cookie的同一台服务器上。

第一个站点是使用Windows身份验证的Intranet站点。此站点有一个简单的Action,用于检查用户是否已通过身份验证,如果用户已经过身份验证,则会创建一个将其添加到响应中的FormsAuthentication cookie。此cookie是为我从用户的AD组确定的通用用户创建的。然后,响应将用户重定向到使用表单身份验证的第二个站点。

当我在本地计算机上运行时,一切都按上述方式工作。当我将其部署到我们的本地Web服务器时,它没有。我已经测试过是否正确确定了用户的组,并且它为cookie创建了一个有效的用户,并且我已经在Web服务器上验证了这是正确的。

以下是我如何做以上所有事情:

首先,我让两个站点使用相同的机器密钥进行加密和解密。

当我在Site1中创建cookie时,我确保它与Site2上创建的cookie具有相同的名称和域。

     var cookie = FormsAuthentication.GetAuthCookie(userName, false);
     cookie.Domain = FormsAuthentication.CookieDomain; //This is the Domain of my 2nd site as they are different

     HttpContext.Response.Cookies.Add(cookie); //Add my cookie to the response
     HttpContext.Response.RedirectPermanent(urlForSite2);

同样,当我在本地计算机上运行它时,它没有问题。但是在部署时,它要么不在请求中传递cookie,要么响应忽略它,但我不确定如何验证这两种情况。

如果能帮助我得到我需要的答案,请随时提出有关我如何做这些事情的更多细节的问题。

2 个答案:

答案 0 :(得分:1)

不允许跨域Cookie。如果您有两个独立的域名;一个人无法访问其他cookie。使用相同的机器密钥时,两个单独的虚拟目录/应用程序将起作用。 http://blogs.technet.com/b/sandy9182/archive/2007/05/07/sharing-forms-cookie-between-asp-net-web-application.aspx

如果您想在子域之间共享登录cookie,则需要将登录cookie的Domain属性编辑到二级域“abc.com”,以便“www.abc.com”和“ww2.abc。 com“将有权访问cookie。 http://forums.asp.net/t/1533660.aspx

String usrName = User.Identity.Name.ToString();
HttpCookie authCookie = Security.FormsAuthentication.GetAuthCookie(usrName, false);
authCookie.Domain = "abc.com";
Response.AppendCookie(authCookie);

答案 1 :(得分:0)

实际上,它有可能,但不像域/子域cookie共享那么简单。

http://www.codeproject.com/KB/aspnet/CrossDomainSSOModel.aspx

虽然本文中给出的示例并不直接适用于我正在做的事情,但我可以使用其中表达的一些想法来获得我需要的工作。它最终成为site2 web.config中的配置设置。

我的网址如下

站点1需要主机条目将其发送到主机的特定IP地址。它也是我的IE安全设置 - 本地Intranet站点中的一个条目。

我应该注意,这些应用程序都是在同一默认网站下运行的虚拟目录。

我以为我已经解决了我的问题但是将配置文件中的域设置为空字符串,但这不起作用。我不确定现在能做些什么。当我在本地计算机上运行它时仍然可以工作,但是当我在服务器上运行它时,它仍然有用。唯一的区别是网址。

我的开发机器正在使用网址

我希望这会增加一些说明。这个答案应该作为我的问题的编辑发布,但是当我最初发布它时,我认为我有它的工作。

更新:我认为我的答案在上面的网址中。我的开发机器URL都使用相同的域名,在本例中是localhost。我想如果我改变我部署的网站使用相同的域名,我会没事的。当我得到它时,我会发布更新。