1

我注意到共享身份验证 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 发行者从其他应用程序中获得较低的超时时间吗?这会有什么影响吗?

4

2 回答 2

2

我最终这样做了,我暂时不会将此标记为答案,以防万一有人指出它的任何问题。

在 Global.asax

void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        if (Context.User == null || !Request.IsAuthenticated)
        {
            HttpContext.Current.Response.Redirect(GetLoginUrl());
        }
        else if (Context.User.Identity is FormsIdentity)
        {
            HttpCookie cookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];

            if (cookie != null)
            {
                FormsAuthenticationTicket currentTicket = FormsAuthentication.Decrypt(cookie.Value);


                if (currentTicket == null && currentTicket.Expired)
                {
                    return;
                }
                FormsAuthenticationTicket newTicket = currentTicket;
                if (FormsAuthentication.SlidingExpiration)
                {
                    FormsIdentity id = (FormsIdentity)Context.User.Identity;
                    newTicket = FormsAuthentication.RenewTicketIfOld(id.Ticket);
                }

                if (currentTicket != newTicket)
                {
                    cookie.Value = FormsAuthentication.Encrypt(newTicket);
                    cookie.Expires = newTicket.Expiration;
                    cookie.Domain = WebGlobal.GetCurrentContextDomain();

                    Response.Cookies.Set(cookie);
                }
            }
        }
    }
于 2013-02-12T11:43:27.790 回答
1

使用您提供的信息,您还可以选择动态修改 Application_Start 中的配置,以便为域属性设置正确的值(如果尚未设置):

看 :

http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28System.Configuration.ConfigurationManager%29;k%28TargetFrameworkMoniker-.NETFramework

希望这会有所帮助


我想可以在表单元素的超时属性描述中找到一个提示:

http://msdn.microsoft.com/en-us/library/1d3t3c61%28v=vs.80%29.aspx

为防止性能受损,并为已打开 cookie 警告的用户避免多个浏览器警告,cookie 会在指定时间过半时更新。这可能会导致精度损失。默认值为“30”(30 分钟)。

在 system.mydomain.com 上是否也设置为 2880 分钟?还是默认的 30 分钟值?如果是这样,您应该会在 15 分钟后看到 cookie 发生变化。


如果您web.config这样设置,问题是否仍然存在?

<authentication mode="Forms" >
  <forms timeout="2880" name=".COMMONAUTH" domain=".mydomain.com" />      
</authentication>
于 2013-02-08T12:44:21.840 回答