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

本文关键字:Cookie 共享 身份验证 站点 NET ASP | 更新日期: 2023-09-27 18:09:25

我有两个MVC3网站。其中一个Site1采用Windows认证方式,属于Local Intranet Zone。第二个(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);

我已经在网上设置了。为每个站点配置一个匹配的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。这只是一个猜测。有什么办法能让我解决这个问题吗?

根据这篇文章,我所做的应该是有效的。有时我认为它是有效的,但这很难说,因为我可能已经缓存了cookie,并且它们被重用了。我希望有人能看到我在这里错过的东西,或者有一个替代的解决方案。

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

那么,这两个变化,这是我在哪里。

它可以在Chrome和Firefox上运行,但不能在IE上运行。不确定。我将在另一台机器和另一个用户上做一些额外的测试,这样我就知道没有任何残留的cookie。

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

我确定我的问题是没有设置cookie的过期属性。根据微软的这篇文章,除非Expires属性被设置,否则cookie不会被写入客户端。

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

在本例中,我需要将cookie写入磁盘,因为我正在执行服务器传输到另一个站点,从而结束该用户的会话。我不能百分之百确定这是修复,但它现在正在工作,所以我假设。