基于 cookie 的身份验证如何在多实例 Web 应用程序中工作?

问题描述 投票:0回答:3

我有一个无状态应用程序(asp.net mvc 4.7.2),它在多个实例上运行。(azure)。

我的应用程序使用表单身份验证(基于 cookie)。

当我在某些情况下登录时,我会从不同的实例返回响应,系统显示为未登录,刷新时再次显示为已登录。这是否应该在多个实例中发生? (当请求和响应由同一实例提供时,并不总是可以重现,并且登录后一段时间后问题似乎无法重现)

我尝试启用 ARR 关联性,但无法重现该问题。 我尝试了 1 个实例,但无法重现该问题。

但是我不应该启用 ARR 亲和性,因为我不断扩大和缩小实例计数。(缩小时出现问题,用户得到 503)。

当我们有多个实例时,有什么解决方案可以解决登录问题吗?

asp.net-mvc azure distributed-system multiple-instances
3个回答
4
投票

ARR 亲和性的想法是将请求路由到同一实例(粘性会话)。通常,它工作得很好,除非实例由于某种原因被删除。

您将面临这个问题,因为您无法控制实例/LB。 “解决方案”是使用其他类型的身份验证和专用会话服务器。


0
投票
  1. 以加密格式将证明身份验证所需的信息发送到 cookie。所以每个实例都可以解密并使用它。 或
  2. 将认证信息以长密钥存储在数据库中,并将密钥发送到cookie。这样每个实例都可以在数据库中查找 或
  3. 如果您想提高安全性,请执行 2,加密密钥并在 cookie 中发送加密密钥。这样每个实例都可以解密密钥并在数据库中查找

0
投票

Cookie 和多实例场景的问题在于,不能保证创建和签署令牌的实例就是验证它的实例。这就是 ARR 关联性解决此问题的原因,因为发出 cookie 的实例将始终是验证它的实例。

在这种情况下,两个实例要正确验证 cookie,需要将密钥环存储在实例之间的共享位置,例如SQL、Redis、Azure Key Vault 等

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-storage-providers?view=aspnetcore-1.0&tabs=visual-studio我知道这是针对 ASP.NET Core 的,但从快速搜索来看,数据保护 API 似乎也用在 .NET Framework 上

© www.soinside.com 2019 - 2024. All rights reserved.