以其他用户身份登录时丢失会话/ cookie

我正在构建dnn模块,允许登录用户以其他用户身份登录。
但我这里有一些有线问题。
这是我注销当前用户和以其他用户身份登录的方式:

 UserInfo userInfo = UserController.GetUserById(portalId, userId); if (userInfo != null) { DataCache.ClearUserCache(this.PortalSettings.PortalId, Context.User.Identity.Name); if (Session["super_userId"] == null) { Session["super_userId"] = this.UserId; Session["super_username"] = this.UserInfo.Username; } HttpCookie impersonatorCookie = new HttpCookie("cookieName"); impersonatorCookie.Expires = DateTime.Now.AddHours(1); Response.Cookies.Add(impersonatorCookie); Response.Cookies["cookieName"]["super_userId"] = this.UserId.ToString(); Response.Cookies["cookieName"]["super_username"] = this.UserInfo.Username; PortalSecurity objPortalSecurity = new PortalSecurity(); objPortalSecurity.SignOut(); UserController.UserLogin(portalId, userInfo, this.PortalSettings.PortalName, Request.UserHostAddress, false); Response.Redirect(Request.RawUrl, true); } 

PageLoad()我尝试从这个cookie读取值,但它没有读取任何内容:

 try { string super_userId = Request.Cookies["cookieName"]["super_userId"]; string super_username = Request.Cookies["cookieName"]["super_username"]; if (!String.IsNullOrEmpty(super_userId)) { this.Visible = true; this.lblSuperUsername.Text = Session["super_username"].ToString(); this.txtPassword.Enabled = true; this.btnBackToMyAccount.Enabled = true; } ... 

我也试过用会话做同样的事情,但没有任何作用,我无法理解为什么?

正如我在这里找到的那样,在重定向的请求中设置cookie可能会出现问题,并且声明当域名不是/时,cookie不会通过重定向设置。

因此,您可以尝试不使用HTTP标头重定向,但显示“登录”页面,而不是包含“主页”链接和元刷新或Javascript重定向 。

顺便说一句,在cookie中设置UserID并不是真正的方法。 如果我将cookie值更改为1怎么办?

我建议你设置一个新的cookie来始终设置Domain ,可能还有Expires

 Response.Cookies[cookieName].Domain = RootURL; Response.Cookies[cookieName].Expires = DateTime.UtcNow.AddDays(cDaysToKeep); 

该域名非常重要,可以是子域名的url,例如只有mydomain.com ,而不是www. 因为如果从www.mydomain.com设置了cookie并且您尝试从mydomain.com读取它,反之亦然,那么cookie将不会被读取并且您可能丢失它/覆盖它。

所以我建议创建一个函数,当你设置一个cookie时,你设置至少3个参数, DomainExpiresValue

类似的问题和答案:
使用相同登录数据库的多个应用程序相互记录
登录到另一个实例时登出的asp.net表单身份validation

把这两个陈述

 Response.Cookies["cookieName"]["super_userId"] = this.UserId.ToString(); Response.Cookies["cookieName"]["super_username"] = this.UserInfo.Username; 

 UserController.UserLogin(portalId, userInfo, this.PortalSettings.PortalName, Request.UserHostAddress, false); 

可能是UserLogin方法正在重置Session变量。 希望能帮助到你 :)