ASP.NET站点身份验证Cookie共享

时间:2011-09-23 14:28:46

标签: c# asp.net asp.net-mvc-3 authentication

我有2个MVC3互联网网站。 One(Site1)使用Windows身份验证并位于本地Intranet区域中。第二个(Site2)是公开可用的,并使用表单身份验证。两个站点都在同一个域中,但具有不同的子域。我想在两者之间共享身份验证cookie。为此,他们需要在Web配置中进行相同的设置。有时候这种方法有效,大部分时间都没有。如果有人从我们的网络外部访问Site1,他们会收到403错误,这很好。如果网络用户访问Site1,则会根据其网络凭据允许他们进入。然后,我使用下面的代码检查用户的角色。

var userName = string.Empty;
var winId = (WindowsIdentity)HttpContext.User.Identity;
var winPrincipal = new WindowsPrincipal(winId);

if(winPrincipal.IsInRole("SiteAdmin")) {
    FormsAuthentication.SetAuthCookie("siteadmin", false);
    userName = "siteadmin"; //This is a Forms Auth user
}
else if(///I check for other roles here and assign like above)

一旦我检查了角色,我就将它们转发到Site2,如果用户处于上面if ...语句中确定的角色之一,则为它们创建一个cookie。

if(!string.IsNullOrEmpty(userName)) {
    //Add a cookie that Site2 will use for Authentication
    var cookie = FormsAuthentication.GetAuthCookie(userName, false);
    cookie.Domain = FormsAuthentication.CookieDomain; //This may need to be changed to actually set the Domain to the Domain of the TVAP site.

    HttpContext.Response.Cookies.Add(cookie);
}

//Network users not found in roles will simply be forwarded without a cookie and have to login
HttpContext.Response.RedirectPermanent(tvapUrl);

我在web.config中为每个站点设置了匹配的MachineKey(validationkey,decryptionkey和validation)。

它们都具有相同的身份验证设置,但模式除外。所以我的配置看起来像这样。

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" name=".ASPXFORMSAUTH" protection="All" path="/" domain="mydomain.com" enableCrossAppRedirects="true" timeout="2880" />
    </authentication>

我认为我的问题是每个'身份验证'模式不同,因此Site2不会使用site1中的身份验证Cookie。这只是猜测。无论如何我能解决这个问题吗?

根据this article,我在这里的工作应该有效。有些时候我认为它有用,但很难说,因为我可能会缓存cookie并重新使用它们。我希望有人可以看到我在这里缺少的东西,或者有另一种解决方案。

更新 我在正常登录后检查了Site2上的身份验证cookie,发现域未设置,所以我删除了那行代码。 此外,我读到有关未设置日期时cookie过期的情况,因此我在发送请求之前在cookie上设置了过期日期。

所以,有了这两个变化,这就是我所处的位置。

适用于Chrome和Firefox,但不适用于IE。不确定。我打算从另一台机器和另一台用户那里做一些额外的测试,所以我知道我没有残留的饼干。

1 个答案:

答案 0 :(得分:2)

我确定我的问题是没有设置我的cookie的Expires属性。根据{{​​3}},除非设置了Expires属性,否则不会将cookie写入客户端。

“如果您没有设置cookie的过期时间,则会创建cookie,但不会将其存储在用户的硬盘上。而是将cookie作为用户会话信息的一部分进行维护。当用户关闭浏览器时,这样的非持久性cookie对于需要存储很短时间的信息非常有用,或者出于安全原因不应该写入客户端计算机上的磁盘。例如,非持久性cookie很有用如果用户正在使用公共计算机,而您不想将cookie写入磁盘。“

在这种情况下,我需要将cookie写入磁盘,因为我正在将服务器转移到另一个站点,从而结束该用户的会话。我不是百分百肯定这是修复,但它现在正在工作,所以我假设。