[英]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個參數, Domain
, Expires
和Value
。
把這兩個陳述
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.