【问题标题】:Proper creation of a cross-domain forms authentication cookie正确创建跨域表单身份验证 cookie
【发布时间】:2013-02-11 03:18:32
【问题描述】:

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

我有三个问题:

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

我的代码:

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"/>

【问题讨论】:

    标签: asp.net cookies forms-authentication


    【解决方案1】:

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

    应该没有什么要检查的。 Forms 身份验证机制将从 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 持久性机制将被此自动行为覆盖

    您的代码应该是:

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

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

    domain属性应该可以,只要你想在mydomain.com的直接子域之间共享认证(xymydomain.com不行),mydomain.com不在公共后缀列表(http://publicsuffix.org/list/

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

     <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 了解更多信息

    【讨论】:

    • 我在 VS 2013 的 v4.5 网站上设置了我的表单身份验证,并将域设置为“acme.com”。访问 site1.acme.com 并进行身份验证会设置 cookie,但在 Firebug 中,cookie 存储在域 site1.acme.com 而不是 acme.com 下,就像我想象的那样。我假设会发生的是浏览器会将身份验证 cookie 发送到来自 site1.acme.com 和 site2.acme.com 的请求,因为我在两者中都设置了相同的机器密钥,所以它应该可以工作,但这肯定是在我的情况下没有发生。有什么想法我哪里出错了吗?
    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2011-01-10
    • 1970-01-01
    • 2014-12-30
    • 2019-02-22
    • 1970-01-01
    • 2012-07-03
    • 2020-02-05
    相关资源
    最近更新 更多