【问题标题】:ASP.NET Identity Cookie across subdomains跨子域的 ASP.NET 身份 Cookie
【发布时间】:2013-10-03 18:32:47
【问题描述】:

对于表单身份验证,我在 web.config 中使用了这个(注意域属性):

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" name=".ASPXAUTH" protection="Validation" path="/" domain=".myserver.dev" />
</authentication>

如何为 Mvc 5 中的新 ASP.NET 身份框架配置跨子域的单点登录?

更多信息:

我正在创建一个多租户应用程序。每个客户端都在一个子域中:

client1.myapp.com

client2.myapp.com

我希望用户能够登录到client1.myapp.com,然后转到client2.myapp.com 并且仍然可以登录。这很容易通过表单身份验证。我正试图弄清楚如何使用新的身份框架来做到这一点。

编辑

这是最终对我有用的代码:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
  AuthenticationType = "Application",
  LoginPath = "/Account/Login",
  CookieDomain = ".myapp.com"
});

【问题讨论】:

  • 您是为所有子域提供一个应用程序,还是为每个子域提供一个应用程序?我有第二个选项,但它不起作用:(
  • 我们可以从App的其他地方访问CookieAuthenticationOptions吗? IE。我们可以在HomeController 中更改它以设置会话超时吗?
  • 我只是想告诉您,如果您在 localhost 上尝试此操作,它可能不起作用。我花了两个小时来确定为什么它不起作用,但我做不到。然后我只想在服务器上尝试这个答案,它就成功了。

标签: c# authentication forms-authentication asp.net-identity


【解决方案1】:

在 Startup.Auth.cs 中,您会看到如下内容:

对于 RC:

app.UseSignInCookies();

这在 RTM 中被删除并替换为 cookie 身份验证的显式配置:

    app.UseCookieAuthentication(new CookieAuthenticationOptions {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login")
    });

CookieAuthenticationOptions 类有一个 CookieDomain 属性,我相信这是您正在寻找的。​​p>

【讨论】:

  • 找到哪个程序集的 DefaultAuthenticationTypes 类?这对我来说没有解决。
  • 它是在Identity.Core里面的RTM里面添加的,如果你使用的是RC bits,你可以设置为“Application”。
  • @Hao Kung,我有两个问题:1)似乎只有不同子域的网站在IIS中使用相同的应用程序池,它们才能单点登录。但是,如果他们使用不同的 AppPool,它就不起作用。 2) 这种单点登录方案只适用于跨SUB域,如何处理跨域的情况?非常感谢!
  • @Chance:是这样吗?你找到解决方案了吗?
  • 这很好,用户保持登录状态,但对我来说注销不再有效,用户保持登录状态。
【解决方案2】:

这让我发疯了,直到我了解到 Identity 2.0 仍然依赖机器密钥来加密身份验证 cookie。因此,如果您希望同一应用程序的两个实例在不同的子域上,那么您需要为每个应用程序设置相同的机器密钥。

总之:

  1. CookieDomain = ".myapp.com"
  2. 在每个应用程序的网络配置中设置相同的机器密钥

    <system.web>
      <machineKey decryptionKey="EEEB09D446CCFE71B82631D37DEDCC917B8CB01EC315" validationKey="60E4EFE8DD26C4BF8CDAEDCA10716C85820839A207C56C8140DB7E32BE04630AD631EDF25C748D0F539918283C5858AF456DBE208320CFFA69244B4E589" />
    </system.web>
    

这个答案让我设置了值: Does ASP.NET Identity 2 use machinekey to hash the password?

【讨论】:

  • 我也有同样的经历。会话 cookie 使用机器密钥加密,因此共享相同 cookie 的不同应用程序必须具有相同的密钥才能解密它。
  • 有人在 2019 年碰巧知道这个问题的解决方案吗?我在不同的子域上有两个站点,当您登录一个站点时,它会将您从另一个站点中注销,身份 cookie 值不匹配并在登录时相互覆盖。
【解决方案3】:

您需要在 web.config 中为所有网站/应用程序设置相同的 machineKey。

所有网站都必须至少具有此配置。

http://msdn.microsoft.com/en-us/library/w8h3skw9(v=vs.85).aspx

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" name=".ASPXAUTH" protection="Validation" path="/" domain=".myserver.dev" />
    </authentication>
    <machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" decryption="Auto"/>
  </system.web>

这是一个例子

【讨论】:

  • 问题是我没有使用表单身份验证。我使用带有会话身份验证的 ASP.NET 身份框架
  • 你说得对,这有帮助。此外,对于 localhost,我必须转到 127.0.0.1 并使用本地 iis。如果您不使用 Forms 身份验证,则可以忽略该部分,但 .Net Identity 需要 machineKey
【解决方案4】:

在 Startup.Auth.cs 文件中,将 CookieDomain 参数添加到您的域中:

var cookieAuthenticationOptions = new CookieAuthenticationOptions
{
    AuthenticationType  = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath           = new PathString("/Account/Login"),
    CookieDomain        = ".mydomain.com"
};

然后,您需要为所有网站设置唯一的机器密钥。生成新文件的最简单方法是使用 IIS:

在您的网站上找到“机器密钥”选项:

点击“生成密钥”按钮获取您的密钥。

最后,上述过程会将以下内容添加到您的web.config 中,您需要确保将其复制到您的每个站点中。

<machineKey
  validationKey="DAD9E2B0F9..."
  decryptionKey="ADD1C39C02..."
  validation="SHA1"
  decryption="AES"
/>

【讨论】:

  • 视觉效果不错,很有帮助
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 2019-02-25
  • 2020-01-13
  • 2020-02-05
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多