跨子域的ASP.NET Identity Cookie

oro*_*edd 40 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>
Run Code Online (Sandbox Code Playgroud)

如何在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"
});
Run Code Online (Sandbox Code Playgroud)

Hao*_*ung 34

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

对于RC:

app.UseSignInCookies();
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 14

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

总结如下:

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

    <system.web>
      <machineKey decryptionKey="EEEB09D446CCFE71B82631D37DEDCC917B8CB01EC315" validationKey="60E4EFE8DD26C4BF8CDAEDCA10716C85820839A207C56C8140DB7E32BE04630AD631EDF25C748D0F539918283C5858AF456DBE208320CFFA69244B4E589" />
    </system.web>
    
    Run Code Online (Sandbox Code Playgroud)

这个答案让我设置了值: ASP.NET Identity 2是否使用machinekey来密码密码?

  • 我也经历过同样的经历.会话cookie使用机器密钥加密,因此共享相同cookie的不同应用程序必须具有相同的密钥才能对其进行解密. (3认同)

chr*_*obo 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>
Run Code Online (Sandbox Code Playgroud)

这是一个例子

  • 问题是我没有使用表单身份验证.我使用ASP.NET身份框架与会话身份验证 (2认同)

JDa*_*ips 12

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

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

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

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

在此输入图像描述

单击"生成密钥"按钮以获取密钥.

在此输入图像描述

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

<machineKey
  validationKey="DAD9E2B0F9..."
  decryptionKey="ADD1C39C02..."
  validation="SHA1"
  decryption="AES"
/>
Run Code Online (Sandbox Code Playgroud)