2012-12-18 112 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); 

可能是用戶登陸方法重置會話變量。 希望它幫助:)

相關問題