【问题标题】:Azure Cache not persisting Session State across VIP swaps?Azure 缓存没有跨 VIP 交换保持会话状态?
【发布时间】:2014-01-08 04:28:20
【问题描述】:

作为这篇文章的后续:Enabling co-located Session Caching in an Azure Cloud Service - 我正在尝试将会话状态存储在 Azure 缓存中,以在 VIP 交换之间保持会话。引用自答案:

要解决此问题,我希望您尝试新的缓存服务 (预习)。通过这种方式,您可以为订阅创建专用缓存 这样您就可以在云服务部署、虚拟 机器和网站。

我已经设置了一个 Azure 缓存(预览版)实例,在我的 web.config 中使用了它的端点和主访问密钥,并部署到了我的 Azure 云服务暂存槽。

然后我使用 Forms auth 登录,并重新部署到同一个插槽。我的凭据被保留了!很高兴看到这一点。

但后来我 VIP 切换到生产,以相同的方式登录到生产实例,重新部署到 Staging,再次切换 VIP,然后刷新,希望保持登录状态,但它没有工作 - 我的会话丢失了在制作和登台方面。

我已按照此处的说明进行操作:

http://www.windowsazure.com/en-us/manage/services/cache/net/how-to-in-role-cache/#getting-started-cache-role-instance

这可能是什么原因造成的?没有抛出异常 - 我的访问密钥有效(通过给它一个伪造的密钥并获得异常进行测试)......我不确定发生了什么。 web.config 中的配置部分:

 <sessionState mode="Custom" customProvider="AFCacheSessionStateProvider" xdt:Transform="Insert">
  <providers>
    <add name="AFCacheSessionStateProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" dataCacheClientName="default" applicationName="AFCacheSessionState"/>
  </providers>
</sessionState>

还有:

<dataCacheClient name="default">
      <autoDiscover isEnabled="true" identifier="mysite.cache.windows.net" />
      <securityProperties mode="Message" sslEnabled="false">
        <messageSecurity authorizationInfo="{my key}" />
      </securityProperties>
    </dataCacheClient>

至于超时政策 - 我已将其设置为永不过期并启用驱逐。我是少数用户之一,缓存将 cookie 存储在 128MB 的空间中,所以我认为这与到期无关。

我还注意到在docs 中,没有applicationName 的条目,正如我上面所说的那样。我尝试删除它并重新测试,但无济于事 - 我的 Prod 会话在 VIP 交换时仍然丢失。

我做错了什么?

更新:

来自微软forum post:

我能够重现该问题。我正在调查。

【问题讨论】:

  • 不是 100% 肯定,但可能是因为当您从 someguid.cloudapp.net(暂存)到 yourwebsite.dom(生产)进行 VIP 交换时域更改时,ASP.Net 会话 Cookie 变得无效?
  • @GauravMantri - 我希望不会。对于我的应用程序的最终用户而言,这会将 VIP 交换从“无缝更新”转变为“无缝挫折”,并且与使用标准同位缓存(对吗?)没有太大区别。需要说明的是 - 我在交换之前登录了 mywebsite.com,并希望通过交换保持登录状态。
  • 我的错 :( 出于某种原因,我以为您登录了一个环境,进行了 VIP 交换,然后还希望保持登录到其他环境。

标签: asp.net-mvc-4 caching azure


【解决方案1】:

表单身份验证不基于会话状态。它仅依赖于客户端 cookie。 Cookie 使用machineKey section of web.config 中指定的密钥进行加密和验证。 默认配置为:

<machineKey validationKey="AutoGenerate,IsolateApps"  
            decryptionKey="AutoGenerate,IsolateApps" 
            validation="SHA1" decryption="Auto" />

AutoGenerate 意味着每台物理机都有自己的decryptionKey。生产 VM 生成的 Cookie 不会被暂存 VM 接受。

在 VIP 交换后,旧生产虚拟机设置的所有 cookie 都将被新生产虚拟机(前暂存虚拟机)拒绝,从而导致所有用户注销。

您需要明确指定 machineKey 值以强制 Forms Auth 生成对新旧生产 VM 均有效的 cookie(请参阅How To: Configure MachineKey, Web Farm Deployment Considerations section)。

查看此在线工具以生成 machineKey 部分:http://aspnetresources.com/tools/machineKey。

UPD:Manage Deployments in Windows Azure/Managing ASP.NET machine keys for IIS中有相关说明:

Windows Azure 自动管理 ASP.NET machineKey 使用 IIS 部署的服务。如果您经常使用 VIP Swap 部署策略,应该手动配置 ASP.NET 机器 键。

【讨论】:

  • 谢谢帕夏。现在读到这个......虽然我不确定这里到底需要改变什么。我是否只需要生成一个密钥并将条目复制/粘贴到 web.config 中?就这么简单吗?
  • 是的,您只需生成一个密钥并将其粘贴到 web.config。确保在测试 VIP 交换之前生产和登台都具有相同的密钥。
猜你喜欢
  • 2012-01-21
  • 1970-01-01
  • 2016-04-19
  • 2012-08-10
  • 2020-09-28
  • 2011-02-15
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多