Azure缓存不会跨VIP交换持久保持会话状态?

时间:2014-01-08 04:28:20

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

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

  

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

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

然后我使用Forms auth登录,并重新部署到同一个插槽。我的凭据一直存在!这很棒。

然后我将VIP换成了Production,以相同的方式登录到生产实例,重新部署到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>

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

我还注意到,在docs中,我没有applicationName的条目。我尝试删除它并重新测试,但没有用 - 我的Prod会话仍然在VIP交换时丢失。

我做错了什么?

更新

来自微软forum post

  

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

1 个答案:

答案 0 :(得分:8)

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

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

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

在VIP交换之后,旧生产VM设置的所有cookie都将被新生产VM(ex-Staging VM)拒绝,导致所有用户都被注销。

您需要明确指定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交换   部署策略,您应该手动配置ASP.NET机器   密钥。