在我们迁移到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;}
是吗,如果不是为什么用户有时会重定向再次登录!!!
答案 0 :(得分:4)
这可能不是会话问题,而是身份验证Cookie /票证问题。 Azure很可能使其服务器负载均衡,即使您只使用单个实例/角色(这使它们具有可靠性%)。这意味着您的应用程序实际上一次存在于多个服务器上。
.NET应用程序中的MachineKey负责加密和解密您的身份验证cookie。在您的web.config中,如果您没有正确定义<machineKey>
属性,那么IIS将为您构建一个机器密钥。运行应用程序的每个服务器如果没有您定义,则会创建自己的机器密钥。因此,一个服务器能够解密和读取您的身份验证票据,而下一个请求将转到另一个无法解密身份验证票证的服务器,因为它使用不同的密钥加密,并且此服务器认为您没有登录。 / p>
要解决此问题,请打开web.config文件并定义<machineKey>
属性并重新部署。使用新部署的应用程序登录后,您应该会看到此问题消失。
答案 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,只是假设用户未经过身份验证。