如果/何时使用" Azure会话状态提供程序(redis)"无需使用User.Identity.Name/IsAuthenticated?

时间:2015-03-15 13:25:17

标签: asp.net asp.net-mvc azure cloud session-state

在我们迁移到Azure服务器场之后,我将Azure会话状态提供程序(redis)隐含在我的asp.net mvc应用程序中,但是一些授权页面将我重定向到登录页面!! 是因为我在某些动作中使用User.Identity.Name或User.Identity.IsAuthenticated !! 我是否必须将User.Identity.Name替换为:

       // instead of below line
      //Boolean usern = User.Identity.IsAuthenticated;
      // is below lines :
        Boolean usern = "";
        object objValue = Session["usersession"];
        if (objValue != null)
           { usern = true;}
        else {usern = false;}

是吗,如果不是为什么用户有时会重定向再次登录!!!

2 个答案:

答案 0 :(得分:4)

这可能不是会话问题,而是身份验证Cookie /票证问题。 Azure很可能使其服务器负载均衡,即使您只使用单个实例/角色(这使它们具有可靠性%)。这意味着您的应用程序实际上一次存在于多个服务器上。

.NET应用程序中的MachineKey负责加密和解密您的身份验证cookie。在您的web.config中,如果您没有正确定义<machineKey>属性,那么IIS将为您构建一个机器密钥。运行应用程序的每个服务器如果没有您定义,则会创建自己的机器密钥。因此,一个服务器能够解密和读取您的身份验证票据,而下一个请求将转到另一个无法解密身份验证票证的服务器,因为它使用不同的密钥加密,并且此服务器认为您没有登录。 / p>

要解决此问题,请打开web.config文件并定义<machineKey>属性并重新部署。使用新部署的应用程序登录后,您应该会看到此问题消失。

Forms authentication and Machine Key information on MSDN

Machine Key Generator

答案 1 :(得分:1)

我不认为会话管理会执行此操作,无论Azure Redis或其他方式。如果您使用的是asp.net身份验证cookie,则需要进行更改以支持多个角色。

我知道这是一篇旧文章,但如果你浏览Moving Applications to Microsoft Azure Cloud Services,你会看到:

  

可能会对应用程序进行进一步更改   影响身份验证过程。如果你要运行aExpense   应用于Azure中的多个Web角色实例,默认情况下   cookie加密机制(使用DPAPI)是不合适的   因为每个实例都有不同的密钥。这意味着一个   由一个Web角色实例创建的cookie将无法读取   另一个Web角色实例。要解决这个问题,你应该使用a   cookie加密机制,使用由所有Web角色共享的密钥   实例。 Global.asax文件中的以下代码显示了如何操作   替换默认的SessionSecurityHandler对象并将其配置为   使用RsaEncryptionCookieTransform类。

基本上如果发生这种情况,重定向到登录页面是因为你正在弹跳到另一个实例,它无法读取asp.net auth cookie,只是假设用户未经过身份验证。