簡體   English   中英

以其他用戶身份登錄時丟失會話/ cookie

[英]Lost session/cookie when login as another user

我正在構建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是被重定向,並且問題在這里是說,餅干將不會設置一個重定向時,他們的域名是不是/

因此,您可以嘗試不使用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表單身份驗證

把這兩個陳述

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變量。 希望能幫助到你 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM