【问题标题】:.NET Core 2.2 with Identity Server 4 SameSite Cookie Changes Issue.NET Core 2.2 与 Identity Server 4 SameSite Cookie 更改问题
【发布时间】:2020-06-21 23:13:27
【问题描述】:

我有一个单页 Web 应用程序,包含以下内容

  1. Angular 8 前端
  2. .Net Core Web Api 后端
  3. .Net Core Identity Server 认证服务器

我最近开始在我的控制台中看到一些警告,上面写着 - “与“”处的跨站点资源关联的 cookie 被设置为没有 'SameSite' 属性。Chrome 的未来版本将仅提供带有跨站点资源的 cookie - 使用“SameSite=None”和“Secure”设置的站点请求。

因此,在此基础上,a 做了一些研究,并找到了下一篇文章,该文章恰好详细解释了正在发生的一切。 Explanation of Cookie Issue

我把这篇文章读了好几遍,认为我已经掌握了它,但我仍然在它的一个简单方面苦苦挣扎。有几个区域他们要求您将一些代码添加到您的“项目”中。我的问题是(仍然是身份服务器及其内部工作的新手),他们所指的“项目”是什么。我不确定将他们提供的代码放在哪里来解决问题。

  1. 对我来说,将提供的代码放在何处并不那么明显。我有 2 个 Visual Studio 解决方案 - 一个代表我的身份验证服务器(身份服务器),一个代表我的 Web Api。我应该在这些解决方案的 Startup.cs 文件中添加哪些代码解决方案?
  2. 如果我将它添加到我的身份服务器项目中,我的困惑是我没有使用任何“基于 Cookie 的身份验证”,因此在我的身份服务器项目中不存在我有一个设置 cookie 的地方并且我知道其中的一部分文章中提到的解决方案是添加一个既“安全”又设置为“Same-Site=None”的 cookie。我应该在项目的哪个位置创建这种类型的 cookie?
  3. 我注意到的另一件事是,一旦设置了 cookie,它们在执行注销时不会被删除。

请注意,这些问题只会出现在运行 Google Chrome 的 MacOS 上。如果我在 Windows PC 上运行我的应用程序,我仍然会看到警告,但我可以注销并清除所有现有 cookie

【问题讨论】:

  • 我同意你的观点,Angular、Web Api 解决方案的文档对于第 3 方身份验证提供商的新手来说很糟糕。我还不能让 Angular 9 和 Asp.net 核心工作。

标签: asp.net-core-webapi identityserver4 asp.net-core-2.1


【解决方案1】:

您将在 Google Chrome 中遇到控制台冲突,并且您的身份服务器无法重定向到可能是适用于 Chrome 版本 80 的 React 应用或 Angular 应用的客户端。

与资源关联的 cookie 设置为 SameSite=None,但没有 Secure。它已被阻止,因为 Chrome 现在只提供标记为 SameSite=None 的 cookie,前提是它们也标记为安全。您可以在 Application>Storage>Cookies 下的开发人员工具中查看 cookie,并在 https://www.chromestatus.com/feature/5633521622188032 上查看更多详细信息。

要解决此问题,您需要在下面的链接中进行更改 -

https://www.thinktecture.com/en/identity/samesite/prepare-your-identityserver/

注意:对于 .Net Core 2.2,设置 SameSite = (SameSiteMode)(-1) ,对于 .Net Core 3.0 或更高版本,设置 SameSite = SameSiteMode.Unspecified

另外,对于 Chrome 80 版本,添加这个额外的条件 -

 if ( userAgent.Contains("Chrome/8"))
            {
                return true;
            }

【讨论】:

    【解决方案2】:

    IdentityServer 将始终在您登录时创建 cookie。 你可以在这里阅读更多 - http://docs.identityserver.io/en/3.1.0/topics/signin.html

    这意味着身份服务器使用cookie来验证用户

    您可以配置相同的站点cookie如下

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie("Cookies", options =>
                {
                    options.Cookie.SameSite = SameSiteMode.Lax;
                });
    

    【讨论】:

    • 另请注意,某些流程(即发生在 iframe 中的流程 - 例如 SPA 的自动静默续订)不适用于 Lax,您应该改用 None。然后还要注意 None 不受某些旧版浏览器的支持,这些浏览器默认为 Strict。更复杂的是,从 Chrome 80 开始,任何未定义 SameSite 的 cookie 默认将被视为Lax。为了使事情更加复杂 - 要在 ASP.Net(和 Core)上显式设置 SameSite=None,您需要运行最新的运行时补丁。
    • 感谢您提供文章链接。因此,根据我从文章中了解到的情况,身份服务器似乎会(开箱即用)无需我进行任何配置,默认情况下会自动发送 cookie。因此,为了更新他们提供的默认 cookie 上的选项(设置相同站点模式并将安全设置为 true),我需要在我的 Identity Server 项目的 Startup.cs 文件中的配置服务方法中添加上述代码吗?
    • 目前我在“ConfigureServices”方法中与身份验证相关的唯一行如下:services.AddAuthenticationServices<IdentityServerConfigurationDbContext, IdentityServerPersistedGrantDbContext, AdminIdentityDbContext, UserIdentity, UserIdentityRole>(Environment, Configuration, Logger); 我需要添加到此代码还是添加您的代码。添加您的代码 sn-p 会干扰我已经为身份验证设置的内容吗?
    • 我不认为它会受到干扰。请注意,identityserver 有它的 cookie - IdentityServerConstants.DefaultCookieAuthenticationScheme 我还没有使用 skoruba 的 IdentityServer4.Admin,所以我不能完全确定。
    猜你喜欢
    • 2020-12-10
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多