2012-12-18 88 views
3

我正在构建dnn模块,它允许登录用户以其他用户身份登录。
但我在这里有一些有线问题。
这是我如何注销当前用户并登录为另一个用户:以其他用户身份登录时丢失会话/ cookie

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; 
    } 
... 

我也试图做与会议相同,但没有任何作品,我不明白为什么?

+0

我的问题是否足够清楚? – 1110

+2

你是否已经逐步完成代码并确保UserInfo和UserId在将它们分配给session/cookie时包含有效值? – CheckRaise

+3

您是否使用过Fiddler等工具来验证cookie是否正在从服务器发送到浏览器中? – user1429080

回答

5

,因为我觉得here,可以有与该被重定向的请求设置cookie的问题,并here中指出,饼干不会得到一个重定向时,他们的域名是不是/设置。

因此,您可以尝试不使用HTTP标头进行重定向,而是显示一个包含“主页”链接和meta refreshJavascript redirect的“登录”页面。

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

+2

@ 1110要对CodeCaster的建议进行评论,您应该考虑在Cookie中存储一个会话ID,并在您的本地应用程序变量(如UserID等)中保存该会话的相关数据。 ..但是,这并不能回答你如何在重新直接阅读现有cookie的直接问题。 – EtherDragon

+0

有一件有线事情让我困惑。在我本地安装的dotnetnuke中,它可以工作(使用会话和cookie),但是当我将其放在服务器上时,它不会:( – 1110

+0

@ 1110什么是工作而不工作的URL? – CodeCaster

1

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

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

域名是非常importan要与出子域名的URL,例如,仅mydomain.com与出www.,因为如果一个cookie被www.mydomain.com中的设置,并尝试从mydomain的阅读。 com或反之亦然,那么cookie将不会被读取,您可能会丢失/覆盖它。

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

类似的问题和答案:
Multiple applications using same login database logging each other out
asp.net forms authentication logged out when logged into another instance

0

把这两个语句

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); 

可能是用户登陆方法重置会话变量。 希望它帮助:)

相关问题