跨子域的ASP.NET Identity Cookie

时间:2013-10-03 18:32:47

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

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

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

如何在Mvc 5中为新的ASP.NET Identity Framework配置子域之间的单点登录?

更多信息:

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

client1.myapp.com

client2.myapp.com

我希望用户能够登录client1.myapp.com,然后转到client2.myapp.com并仍然可以登录。使用表单身份验证很容易。我正在试图弄清楚如何使用新的Identity Framework来实现它。

修改

以下是最终适合我的代码:

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

4 个答案:

答案 0 :(得分:34)

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

RC的

app.UseSignInCookies();

这已在RTM中删除,并替换为cookie auth的显式配置:

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

CookieAuthenticationOptions类有一个CookieDomain属性,我相信你正在寻找它。

答案 1 :(得分:14)

这让我疯狂,直到我得知Identity 2.0仍然依赖于机器密钥来加密身份验证cookie。因此,如果您想在不同的子域上使用同一个应用程序的两个实例,则需要为每个应用程序设置相同的机器密钥。

总结如此:

  1. CookieDomain =“。myapp.com”
  2. 在每个应用程序的Web配置中设置相同的机器密钥

    <system.web>
      <machineKey decryptionKey="EEEB09D446CCFE71B82631D37DEDCC917B8CB01EC315" validationKey="60E4EFE8DD26C4BF8CDAEDCA10716C85820839A207C56C8140DB7E32BE04630AD631EDF25C748D0F539918283C5858AF456DBE208320CFFA69244B4E589" />
    </system.web>
    
  3. 这个答案促使我设定了价值观: Does ASP.NET Identity 2 use machinekey to hash the password?

答案 2 :(得分:13)

您需要在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>

这是一个例子

答案 3 :(得分:12)

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

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

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

找到&#34;机器密钥&#34;您网站上的选项:

enter image description here

点击&#34;生成密钥&#34;按钮来获取你的钥匙。

enter image description here

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

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