我有一个无状态应用程序(asp.net mvc 4.7.2),它在多个实例上运行。(azure)。
我的应用程序使用表单身份验证(基于 cookie)。
当我在某些情况下登录时,我会从不同的实例返回响应,系统显示为未登录,刷新时再次显示为已登录。这是否应该在多个实例中发生? (当请求和响应由同一实例提供时,并不总是可以重现,并且登录后一段时间后问题似乎无法重现)
我尝试启用 ARR 关联性,但无法重现该问题。 我尝试了 1 个实例,但无法重现该问题。
但是我不应该启用 ARR 亲和性,因为我不断扩大和缩小实例计数。(缩小时出现问题,用户得到 503)。
当我们有多个实例时,有什么解决方案可以解决登录问题吗?
ARR 亲和性的想法是将请求路由到同一实例(粘性会话)。通常,它工作得很好,除非实例由于某种原因被删除。
您将面临这个问题,因为您无法控制实例/LB。 “解决方案”是使用其他类型的身份验证和专用会话服务器。
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 上)