正确创建跨域表单身份验证cookie

时间:2013-02-25 20:44:38

标签: asp.net cookies forms-authentication

我只是在两个服务器之间创建一个简单的测试。基本上,如果用户已经过身份验证,我希望能够在应用程序之间传递它们。我更改了密钥以隐藏它们

我有三个问题:

  1. 跨域应用程序验证cookie的正确方法是什么。例如,当用户登陆successpage.aspx我应该检查什么?
  2. 以下代码是否对创建跨域身份验证Cookie有效?
  3. 我的web.config设置是否正确?
  4. 我的代码:

    if (authenticated == true)
    {
      //FormsAuthentication.SetAuthCookie(userName, false);
      bool IsPersistent = true;
      DateTime expirationDate = new DateTime();
      if (IsPersistent)
        expirationDate = DateTime.Now.AddYears(1);
      else
        expirationDate = DateTime.Now.AddMinutes(300); 
    
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
          1,
          userAuthName,
          DateTime.Now,
          expirationDate,
          IsPersistent,
          userAuthName,
          FormsAuthentication.FormsCookiePath);
    
      string eth = FormsAuthentication.Encrypt(ticket);
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, eth);
      if (IsPersistent)
        cookie.Expires = ticket.Expiration;
    
      cookie.Domain = ".myDomain.com";
      Response.SetCookie(cookie);
      Response.Cookies.Add(cookie);
    
      Response.Redirect("successpage.aspx");
    }
    

    我的配置:

    <authentication mode="Forms">
      <forms loginUrl="~/Default.aspx" timeout="2880" name=".AUTHCOOKIE" domain="myDomain.com" cookieless="UseCookies" enableCrossAppRedirects="true"/>
    </authentication>
    <customErrors mode="Off" defaultRedirect="failure.aspx" />
    <machineKey decryptionKey="@" validationKey="*" validation="SHA1"  decryption="AES"/>
    

1 个答案:

答案 0 :(得分:4)

  

跨域应用程序验证cookie的正确方法是什么。   例如,当用户登陆successpage.aspx时,我应该检查什么?

不应该检查任何东西。表单身份验证机制将从cookie检索票证,检查它是否有效。如果不存在或无效,用户将重定向到〜/ Default.aspx。 如果您的Cookie与您的web.config

的配置相匹配,这将有效
  

以下代码是否对创建跨域身份验证Cookie有效?

我认为您不应该尝试通过手动处理cookie来覆盖web.config的设置。我认为有更好的方法来处理cookie持久性(请参阅下面的web.config),你只是实现了Forms身份验证API的一部分(例如,为SSL取消了web.config)

  1. 在这里,您的手动cookie不是HttpOnly:例如,您可以通过XSS进行cookie盗窃
  2. FormsAuthentication有自己的处理cookie的方式(参见http://msdn.microsoft.com/en-us/library/1d3t3c61%28v=vs.80%29.aspx中的TimeOut属性描述)你的cookie持久性机制将被这种自动行为覆盖
  3. 您的代码应该是:

    if (authenticated)
    {  
      bool isPersistent = whateverIwant;
      FormsAuthentication.SetAuthCookie(userName, isPersistent );
      Response.Redirect("successpage.aspx");
    }
    
      

    我是否正确设置了web.config?

    域属性应该没问题,只要您想在mydomain.com的直接子域之间共享身份验证(它不适用于xymydomain.com),并且mydomain.com不在公共后缀中列表(http://publicsuffix.org/list/

    我会将timeout和slidingExpiration属性更改为:

     <forms loginUrl="~/Default.aspx" timeout="525600" slidingExpiration="false" name=".AUTHCOOKIE" domain="myDomain.com" cookieless="UseCookies" enableCrossAppRedirects="true"/>
    

    我想这是处理一年持久性cookie和会话cookie之间选择的好方法。有关详细信息,请参阅https://stackoverflow.com/a/3748723/1236044