C# 在2.NET核心应用程序DataProtectionProvider之间共享cookie

C# 在2.NET核心应用程序DataProtectionProvider之间共享cookie,c#,iis,cookies,asp.net-core,asp.net-identity,C#,Iis,Cookies,Asp.net Core,Asp.net Identity,我试图在IIS中的单个网站下设置的三个web应用程序之间共享身份验证cookie。前两个都是.NETCore2.1应用程序,我甚至很难让它们共享它。我的问题和你的一样 但我不能让它在我的环境中工作。 我读过“使用ASP.NET和ASP.NET核心在应用程序之间共享Cookie”,下载了“Cookie共享应用程序示例”并使其正常工作(因为第三个应用程序是ASP.NET),现在我在StartUp.cs中的代码在2.NET核心应用程序中都是这样的 services.AddDataProtection

我试图在IIS中的单个网站下设置的三个web应用程序之间共享身份验证cookie。前两个都是.NETCore2.1应用程序,我甚至很难让它们共享它。我的问题和你的一样

但我不能让它在我的环境中工作。 我读过“使用ASP.NET和ASP.NET核心在应用程序之间共享Cookie”,下载了“Cookie共享应用程序示例”并使其正常工作(因为第三个应用程序是ASP.NET),现在我在StartUp.cs中的代码在2.NET核心应用程序中都是这样的

services.AddDataProtection()
    .PersistKeysToFileSystem(new 
     DirectoryInfo(persistKeysToFileSystemDirectory))
            .SetApplicationName(applicationName);

        services.ConfigureApplicationCookie(options => {
            options.Cookie.Name = cookieName;
            options.Cookie.SameSite = SameSiteMode.Lax;
            options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
        });
如果这两个应用程序解决方案在我的本地计算机(IISEXPRESS)上的localhost下运行

http:\localhost:8174\

http:\localhost:8175\

它们工作正常,但当我部署到服务器(IIS)时,url变为

http:\devserver1:8000\App1

http:\devserver1:8000\App2

并且它们不共享身份验证

如果我将本地解决方案更改为以

http:\localhost:8174\App1

http:\localhost:8175\App2

它们不共享身份验证

我不认为我必须设置cookie域属性,因为它们都在同一个站点下,但是我已经在本地进行了实验

options.Cookie.Domain = "localhost";
在服务器上

options.Cookie.Domain = "devserver1";
什么都不起作用,有时甚至不让我登录(无效域?)

任何帮助都将不胜感激

**更新** 我越来越焦虑,并且已经进步了,还有更多的事情要补充

如果我将应用程序设置为单独的网站,在devServer 1上具有不同的端口

http:\devserver1:8174\

http:\devserver1:8175\

它可以工作,它们共享身份验证(我也不必设置options.Cookie.Domain值)-但是我将无法再使用相对url从一个指向另一个,因此App1将无法转到\App2-我将必须使用完整的url-但至少它可以工作

这不是世界末日,但这似乎破坏了IIS网站中应用程序的整体概念(这有什么意义?),因此我开始怀疑我设置IIS的方式是否是问题所在

我创建一个空网站,然后为我的每个应用程序“添加应用程序”

services.AddDataProtection()
    .PersistKeysToFileSystem(new 
     DirectoryInfo(persistKeysToFileSystemDirectory))
            .SetApplicationName(applicationName);

        services.ConfigureApplicationCookie(options => {
            options.Cookie.Name = cookieName;
            options.Cookie.SameSite = SameSiteMode.Lax;
            options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
        });
目前,我正试图在开发服务器(devserver1)上实现这一点,所以我没有设置主机名,我只是通过机器名引用Web服务器

在FormsAuthentication共享机器密钥的情况下,这一切都很好,我真的开始后悔我开始看.NET内核了


如果您有任何帮助,我们将不胜感激

请尝试如下设置cookie路径值。默认情况下,它将被限制为App1或App2(我的经验)


检查。

我得到了它,为此我做了以下工作:

我创建了一个网站,并添加了两个应用程序,如您:

http:\devserver1:8000\App1,http:\devserver1:8000\App2

然后在启动时使用以下命令:

services.AddDataProtection()
.PersistKeysToFileSystem(new 
 DirectoryInfo(persistKeysToFileSystemDirectory))
        .SetApplicationName(applicationName);

    services.ConfigureApplicationCookie(options => {
        options.Cookie.Name = cookieName;
        options.Cookie.Path = "/";// it's necessary, because by default cookie Path for App1 will be /App1, and for App2 /App2.
    });

据我所知,设置域是不必要的,默认情况下将使用域

您可以在服务器上的IIS中创建域帐户并在该域帐户下运行两个应用程序。使用本地IIS,然后对cookie域使用本地主机IP(127.0.0.1),而不是在我设置选项时使用“localhost”@Kyle 1。cookie.domain=“127.0.0.1”;它甚至不允许我登录(不编写cookie?),因此我认为这是无效的。我有许多应用程序是以这种方式运行的。如果您使用SSL,请确保您至少为本地IIS设置了自签名证书。我在使用localhost运行所有应用程序时遇到问题,因为它们包括自定义SSO提供程序等内容。