【问题标题】:Asp.Net Core - Prevent Session cookie conflict between same domain applicationsAsp.Net Core - 防止相同域应用程序之间的会话 cookie 冲突
【发布时间】:2019-09-12 08:51:58
【问题描述】:

我正在使用 ASP.Net Core 2.2。

默认情况下,会话 cookie 存储在特定域上名为 .AspNetCore.Session 的 cookie 中(例如:mydomain.com)。

在我的情况下,我在域下有多个 .net 核心应用程序。 mydomain.com/Module1mydomain.com/Module2等……

在这种情况下,所有应用程序为其会话共享相同的 cookie。结果是应用程序尝试读取另一个会话并在日志中生成警告:

取消保护会话 cookie 时出错。 System.Security.Cryptography.CryptographicException:在密钥环中找不到密钥 {...}。

虽然这只是一个警告,而且会话似乎在每个应用程序上都可以正常工作,但我想知道处理这种情况的正确方法。

谢谢。

【问题讨论】:

    标签: asp.net session asp.net-core cookies session-cookies


    【解决方案1】:

    我发现的一个解决方案是更改每个应用程序的会话 cookie 名称:

    Startup / Configure()

    app.UseSession(new SessionOptions() { Cookie = new CookieBuilder() { 
        Name = ".AspNetCore.Session.MyApp1"}});
    

    【讨论】:

    • 这个答案解决了我遇到的类似问题,但我想了解更多信息。你能详细说明为什么会发生这种情况吗?我可以参考的任何文章或论坛都将对此有很大帮助。谢谢
    • 您也可以在Startup / ConfigureServices()方法中配置自定义会话cookie名称:services.AddSession(options => { options.Cookie.Name = ".MyApp1.Session"; });
    • 我的情况略有不同。我运行了两个 asp.net 核心应用程序。应用程序 A 重定向到应用程序 B,应用程序 B 重定向回应用程序 A。重定向回应用程序 A 导致“取消保护会话 cookie 时出错”。错误登录事件查看器(用户没有看到任何错误)。按照您的建议在两个应用中命名 cookie 可以解决问题。
    • 我遇到了同样的问题,因为我为 prod 运行相同的应用程序并在同一台服务器上进行测试(prod:端口 443,测试另一个端口)。我最终为应用程序定义了一个“短名称”(在我的例子中是“MG”),在启动时从 .ini 读取环境(产品/测试)并在运行时动态生成 cookie 名称(MGT 用于测试,MGP 用于产品)。这样我就可以在同一台服务器上运行同一个应用程序而无需更改代码,并且稍后在同一台服务器上运行其他应用程序(使用其他短名称)。
    【解决方案2】:

    当您在Startup / ConfigureServices() 中定义了.AddAuthentication 时,以这种方式修复此添加cookie 选项。为我的案子工作。

      services.AddAuthentication(CookieScheme) // Sets the default scheme to cookies
                 .AddCookie(CookieScheme, options =>
                 {
                     options.LogoutPath = "/logout";
                     options.LoginPath = "/login";
                     options.Cookie = new CookieBuilder()
                     {
                         IsEssential = true,
                         SameSite = SameSiteMode.Lax,
                         SecurePolicy = CookieSecurePolicy.SameAsRequest,
                         Name = ".AspNetCore.Session.yourAppName"
                     };
                 });
    

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2018-08-25
      相关资源
      最近更新 更多