在2个.NET Core应用程序DataProtectionProvider之间共享cookie

时间:2018-08-15 16:31:25

标签: c# iis cookies asp.net-core asp.net-identity

我正在尝试在IIS中单个网站下设置的三个Web应用程序之间共享身份验证cookie。前两个都是.NET Core 2.1应用程序,而Im甚至很难让他们共享它。我的问题与

相同

Sharing Cookies Between Two ASP.NET Core Applications

但是我无法使其在我的环境中工作。 我已阅读“在具有ASP.NET和ASP.NET Core的应用程序之间共享cookie”。并下载了“ Cookie共享应用程序示例”并使其正常运行(因为第三个应用程序是ASP.NET),现在我在StartUp.cs中的代码在两个.NET Core应用程序中都看起来像这样

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";

没有任何效果,有时甚至不能让我登录(域无效?)

任何帮助将不胜感激

**更新**

我越来越着急,已经进步了,还有很多补充。

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

http:\ devserver1:8174 \

http:\ devserver1:8175 \

它可以工作并且它们共享身份验证(同样,我也不必设置options.Cookie.Domain值)-但是我将无法再使用相对URL来相互引用,因此App1将不会能够转到\ App2-我将必须使用完整的网址-但至少可以使用

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

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

当前,我只是想在开发服务器(devserver1)上使它正常工作,因此我没有设置主机名,因此我只是通过机器名来引用网络服务器

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

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

尝试如下设置cookie路径值。默认情况下,它将仅限于App1或App2(根据我的经验)。

options.Cookie.Path = "/";

选中Controlling Cookie Scope

答案 1 :(得分:0)

我明白了,为此我做了以下事情:

我创建了一个网站,并添加了 2 个应用程序,就像您一样:

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

然后在 StartUp 下面使用:

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.
    });

没有必要设置域,据我所知,默认会使用域