我注意到共享身份验证 cookie 设置的一些奇怪行为,这是我的场景。
我有两个应用程序,其域类似于以下内容:
login.mydomain.com system.mydomain.com
我将用户重定向到 login.mydomain.com 并像这样在 mydomain.com 上删除 cookie。
system.mydomain.com:
void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (Context.User == null || !Request.IsAuthenticated)
{
HttpContext.Current.Response.Redirect("http://login.mydomain.com");
}
}
login.mydomain.com
protected void btnSubmit_Click(object sender, EventArgs e)
{
pnlLoginNotice.Visible = true;
if (Membership.ValidateUser(txtUsername.Text, txtPassword.Text))
{
HttpCookie cookie = FormsAuthentication.GetAuthCookie(txtUsername.Text, chkRememberMe.Checked);
cookie.Domain = "mydomain.com";
Response.Cookies.Set(cookie);
}
}
网络配置:
<authentication mode="Forms" >
<forms timeout="2880" name=".COMMONAUTH" />
</authentication>
现在我看到的行为是我有时会在 system.mydomain.com 下找到 .COMMONAUTH cookie,而在 mydomain.com 下有相同的 cookie。我注意到它在网站上一段时间不活动后出现。
asp.net 是否有可能自己删除 cookie 以保持表单身份验证有效?
更新 我尝试了以下方法
1:
system.mydomain.com Web.config
<authentication mode="Forms" >
<forms timeout="1" name=".COMMONAUTH" />
</authentication>
login.mydomain.com Web.config
<authentication mode="Forms" >
<forms timeout="2" name=".COMMONAUTH"/>
</authentication>
一分钟后刷新 system.mydomain.com 中的页面时,我在 system.mydomain.com 下获得 .COMMONAUTH cookie
2:
system.mydomain.com Web.config
<authentication mode="Forms" >
<forms timeout="2" name=".COMMONAUTH" />
</authentication>
login.mydomain.com Web.config
<authentication mode="Forms" >
<forms timeout="1" name=".COMMONAUTH"/>
</authentication>
一分钟后刷新 system.mydomain.com 中的页面时,我退出了。
3:
system.mydomain.com Web.config
<authentication mode="Forms" >
<forms timeout="1" name=".COMMONAUTH" domain="mydomain.com" />
</authentication>
login.mydomain.com Web.config
<authentication mode="Forms" >
<forms timeout="2" name=".COMMONAUTH" domain="mydomain.com"/>
</authentication>
一分钟后刷新 system.mydomain.com 中的页面时,一切都保持不变,我仍然通过身份验证。不确定将第三个应用程序引入此设置时会发生什么
结论
我认为我的问题来自未在 web.config 中设置域,因此 system.mydomain.com 正在尝试刷新 cookie 但正在使用自己的域,因为我没有告诉它应该在哪里做。
我的问题是这些应用程序将具有不同的域绑定,并且它们将为多个客户端托管一次。我无法设置 FormsAuthentication.CookieDomain 因为它是只读的。
我应该选择选项 2,并让我的 cookie 发行者从其他应用程序中获得较低的超时时间吗?这会有什么影响吗?