【问题标题】:Forms authentication & subdomain表单身份验证和子域
【发布时间】:2013-03-21 18:29:03
【问题描述】:

我正在尝试使用适用于我的顶级域和子域的表单身份验证。

例如,如果我使用以下域登录:mydomain.com,然后转到 www.mydomain.com,我希望能够识别用户谁登录了 mydomain.com(这是同一个应用程序)。

我在我的 web.config 文件中使用以下内容:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" domain="mydomain.com" timeout="2880" />
</authentication>

这是一个 mvc 项目,我通过以下 API 获取用户 ID:

HttpContext.Current.User.Identity.Name

对用户进行openid登录后,通过以下api创建表单认证cookie:

FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);

我可以看到身份验证 cookie 被发送到两个域,但只有进行身份验证的域才能识别用户。

我做错了吗?

谢谢, 里尔

【问题讨论】:

标签: asp.net-mvc forms authentication subdomain


【解决方案1】:

确保这两个应用程序具有相同的machine keys 设置。如果身份验证令牌是使用应用程序 1 的机器密钥加密的,而应用程序 2 的密钥不同,它将无法解密。

【讨论】:

    【解决方案2】:

    This question 与您的不完全相同,但看起来正是您正在寻找的解决方案。

    【讨论】:

      【解决方案3】:

      您需要在顶级域中签发票证,以便被子域识别。这是因为 cookie 的工作原理:

      如果您在 domain.com 中设置 cookie,它将在 sub.domain.com 上可见 但是,如果您在 sub.domain.com 上设置它,它将在 domain.com 上不可见

      这是由于 cookie 造成的安全问题,除了与验证/拒绝身份验证 cookie 相关的 &lt;form&gt; 元素的设置之外,您还必须考虑它,您需要在其中拥有 domain='domain.com' ,你已经这样做了。

      除此之外,如果在子域上您有不同的应用程序,您将需要明确定义机器密钥相同。您可以在此处生成自己的一些密钥:http://aspnetresources.com/tools/machineKey

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多