首页 文章

跨子域的ASP.NET Identity Cookie

提问于
浏览
40

对于表单身份验证,我在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 回答

  • 14

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

    对于RC:

    app.UseSignInCookies();
    

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

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

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

  • 34

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

    So in summary:

    • CookieDomain = ".myapp.com"

    • 在每个应用程序的Web配置中设置相同的机器密钥

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

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

  • 12

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

    这是一个例子

  • 13

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

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

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

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

    enter image description here

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

    enter image description here

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

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

相关问题