gpt4 book ai didi

Azure session 表在 AspProvider 的 TableStorageSessionStateProvider 中保持为空

转载 作者:行者123 更新时间:2023-12-03 06:04:53 25 4
gpt4 key购买 nike

我们有一个 Web 角色,它曾经在单个实例中运行一段时间。为了应对更高的负载(并获得更好的 SLA),我们目前正在迁移角色以支持多个实例。

该角色使用表单例份验证(使用自定义成员资格提供程序),我们的理解是,我们必须在实例之间启用某种共享 session 状态,因此如果用户登录实例 1 并获取他的 .ASPXAUTH cookie,那么实例 2 就知道这个 cookie。

我们做到了,目前该角色正在两个实例上运行,一切正常。我们测试了用户保持登录状态,即使他的请求是在他登录的实例之外的另一个实例上处理的。如果用户不登录,访问就会被拒绝。

我们还检查了 TableStorageSessionStateProvider 是否在 Azure 表存储帐户中创建了表,确实存在一个带有 PartitionKey 的表 SessionsRowKeyTimestamp 列。

但是,令我们惊讶的是,Sessions 表始终保持为空。无论有多少用户登录,表中都没有数据。

如果不通过Sessions表,这些实例如何进行通信?

最佳答案

您在这里混淆了两个不同的东西:身份验证 session 状态

确实,为了在多个实例中使用 session 状态,您需要一个共享存储(InProc 不起作用)。在这种情况下,TableStorageSessionStateProvider 将起作用,因为所有实例都可以访问此处存储的 session 数据。当您在用户的当前 session 中存储某些内容(例如购物车)时,将使用 session 状态。您可以这样调用它:Session["UserShoppingCart"] = shoppingCart;

但是您在问题中所描述的内容与 session 状态无关,而是与表单例份验证有关。当您在实例 1 上进行身份验证时,您将获得一张返回票证(存储在 .ASPXAUTH cookie 中)。该票证经过加密和签名,包含基本信息,例如您的用户名、到期时间、自定义用户数据……

现在您有多个实例,下一个请求可能会将您带到实例 2。我认为您的问题是,实例如何通信? 嗯,他们没有。每当请求开始时,在到达您的页面或 Controller 之前,FormsAuthenticationHttpModule 就会启动并查找 .ASPXAUTH cookie。它检查签名,解密它,然后使用 cookie(票证)中的信息填充 HttpContext.Current.User。

实例之间的唯一链接是 machineKey(用于加密/解密/签名/验证 cookie)。每当您在 Windows Azure 中部署多个实例时,Fabric Controller 都会确保 all instances get the same machineKey 。这样,实例 2 将能够解密并验证由实例 1 加密和签名的票据。

关于Azure session 表在 AspProvider 的 TableStorageSessionStateProvider 中保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12910629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com