【问题标题】:Forms authentication, shared cookie issues表单身份验证、共享 cookie 问题
【发布时间】:2013-02-08 10:56:00
【问题描述】:

我注意到共享身份验证 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);
        }
    }

Web.config:

<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 颁发者从其他应用程序中获得较低的超时时间?这会有什么影响吗?

【问题讨论】:

    标签: asp.net cookies forms-authentication subdomain


    【解决方案1】:

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

    在 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);
                    }
                }
            }
        }
    

    【讨论】:

    • 嗨,马修,从长远来看,这个解决方案对您有用吗?我们遇到了同样的问题,无法弄清楚这些“流氓”cookie 是在哪里创建的。最初,用户可以登录并被分配“test.com”cookie,但系统会在到期时随机生成“subdomain.test.com”cookie,我们似乎无法停止。您似乎遇到了同样的问题。
    【解决方案2】:

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

    见:

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

    希望这会有所帮助


    我猜想在forms元素的timeout属性描述中可以找到提示:

    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>
    

    【讨论】:

    • 我没有尝试过,因为应用程序的计划是为多个域进行一次部署,以满足不同的客户。话虽如此,设置 FormsAuthentication.CookieDomain 会有同样的效果吗?
    • 两者都是 2880,我尝试将超时设置为 1,但我现在无法复制该问题,但这不是我所做的唯一更改。在这里找到了一些信息:msdn.microsoft.com/en-us/library/eb0zx8fc(v=vs.100).aspx
    • 刚刚尝试了其他方法,我在 system.mydomain.com 上将超时设置为 1 分钟,在 login.mydomain.com 上设置为 2 分钟。 1 分钟后,我刷新了 system.mydomain.com 上的一个页面,并在 system.mydomain.com 上删除了一个 .COMMONAUTH cookie。 .net 是否会在 cookie 过期之前尝试刷新它?
    • 遗憾的是,我无法通过代码设置 cookie 域,因为它是只读的:|
    • @MatthewGrima 您可以尝试在表单元素中添加属性 slipExpiration="true" 看看它是否有所作为
    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2018-02-17
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多