在子域中跨ASP.NET共享ASP.NET 5中的身份验证Cookie

时间:2015-07-17 12:55:49

标签: asp.net authentication cookies single-sign-on asp.net-core

我有两个ASP.NET 5 MVC 6应用程序。

一个在www.mydomain.tld,另一个在world1.mydomain.tld

如果用户登录www子域的应用程序,我希望她也登录world1子域的应用程序。使用ASP.NET Identity 3实现登录。

我已在Startup.cs中设置了两个应用程序,如下所示:

public void ConfigureServices (IServiceCollection services) {
    // [...]

    services.AddCaching();
    services.AddSession(
        options => {
            options.CookieDomain = ".mydomain.tld";
            options.IdleTimeout = TimeSpan.FromMinutes(30);
        }
    );

    // [...]
}

public void Configure (IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) {
    // [...]

    app.UseCookieAuthentication(null, IdentityOptions.ExternalCookieAuthenticationScheme);
    app.UseCookieAuthentication(null, IdentityOptions.TwoFactorRememberMeCookieAuthenticationScheme);
    app.UseCookieAuthentication(null, IdentityOptions.TwoFactorUserIdCookieAuthenticationScheme);
    app.UseCookieAuthentication(
        config => {
            config.CookieDomain = ".mydomain.tld";
        },
        IdentityOptions.ApplicationCookieAuthenticationScheme
    );

    // [...]
}

我还通过web.config设置了两个应用程序的机器密钥,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <machineKey decryption="AES"
                decryptionKey="SOME DECRYPTION KEY"
                validation="HMACSHA256"
                validationKey="SOME ENCRYPTION KEY" />
  </system.web>
</configuration>

登录www子域工作正常,但访问world1子域上的网站不起作用,因为身份验证cookie未被识别为有效的登录cookie。

我做错了什么?

1 个答案:

答案 0 :(得分:5)

应用互相automatically isolated。你需要确保三件事;

  1. 他们使用相同的密钥库
  2. 他们使用相同的应用程序ID。
  3. 他们在同一个应用程序池中,或者每个池中的标识相同。
  4. 在同一主机上运行的应用程序在相同的托管机制下将使用相同的密钥库。如果它们位于不同的计算机上,则需要在网络驱动器或其他共享位置(如azure blob存储)上使用密钥存储区。

    为了设置两个应用程序共有的应用程序ID,您需要configure数据保护堆栈。

    例如,

    <div id="main2">
    <?php include('newsong.php'); ?>
    </div>
    

    如果您需要以不同的用户身份运行应用程序,则需要更改密钥的保护方式,以使用机器级DPAPI或X509证书。

    您不需要在web.config中输入机器密钥,机器密钥不再是用户。