Asp.net mvc 4 Azure缓存未跨VIP交换持久化会话状态?

Asp.net mvc 4 Azure缓存未跨VIP交换持久化会话状态?,asp.net-mvc-4,caching,azure,Asp.net Mvc 4,Caching,Azure,作为本文的后续内容:-我正在尝试将会话状态存储在Azure缓存中,以在VIP交换之间持久化会话。从答案中引述: 要解决此问题,我希望您尝试新的缓存服务 (预览)。通过这种方式,您可以为订阅创建专用缓存 这样,您就可以跨云服务部署、虚拟 机器和网站 我已经设置了一个Azure缓存(预览)实例,在我的web.config中使用了它的端点和主访问密钥,并部署到我的Azure云服务临时槽中 然后我使用Forms auth登录,并重新部署到同一个插槽。我的证书被保留了!这真是太好了 但随后我将VIP切换到

作为本文的后续内容:-我正在尝试将会话状态存储在Azure缓存中,以在VIP交换之间持久化会话。从答案中引述:

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

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

然后我使用Forms auth登录,并重新部署到同一个插槽。我的证书被保留了!这真是太好了

但随后我将VIP切换到生产环境,以相同的方式登录到生产实例,重新部署到暂存环境,再次进行VIP交换,然后刷新,希望保持登录状态,但无法正常工作—我的会话在生产环境和暂存环境中都丢失了

我遵循了这里的说明:

这可能是什么原因造成的?没有抛出异常-我的访问密钥有效(通过给它一个伪密钥并得到一个异常进行测试)。。。我不知道发生了什么事。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>

,没有我上面提到的
applicationName
条目。我尝试删除它并重新测试,但没有成功-我的Prod会话在VIP交换时仍然丢失

我做错了什么

更新:

来自微软的:

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


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

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

自动生成意味着每台物理机器都有自己的解密密钥。暂存VM将不接受生产VM生成的Cookie

VIP交换后,旧生产虚拟机设置的所有Cookie将被新生产虚拟机(ex-Staging VM)拒绝,导致所有用户注销

您需要显式指定machineKey值,以强制Forms Auth生成对新的和旧的生产虚拟机都有效的cookie(请参阅)

检查此联机工具以生成machineKey节:

UPD:以下文件中有相关注释:

Windows Azure自动管理的ASP.NET machineKey 使用IIS部署的服务。如果您经常使用VIP交换 部署策略时,应手动配置ASP.NET计算机 钥匙


不是100%确定,但可能是因为ASP.Net会话Cookie在您将someguid.cloudapp.Net(登台)的VIP交换到yourwebsite.dom(生产)时域发生更改而无效?@GauravMantri-我希望不是。这将使VIP交换从“无缝更新”变成我的应用程序最终用户的“无缝挫折”,与使用标准的同位缓存没有太大区别(对吧?)。需要澄清的是,我在交换之前登录了mywebsite.com,希望通过交换继续登录。我的坏消息:(出于某种原因,我认为您登录了一个环境,进行了VIP交换,然后希望继续登录到其他环境。谢谢Pasha。现在阅读此内容…虽然我不确定这里到底需要更改什么。我只需要生成密钥并将条目复制/粘贴到web.config中吗?有这么简单吗?是的,您需要st必须生成一个密钥并将其粘贴到web.config。在测试VIP交换之前,确保生产和暂存都具有相同的密钥。
<machineKey validationKey="AutoGenerate,IsolateApps"  
            decryptionKey="AutoGenerate,IsolateApps" 
            validation="SHA1" decryption="Auto" />