3

我正在构建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;
    }
...

我也尝试对 session 做同样的事情,但没有任何效果,我不知道为什么?

4

3 回答 3

5

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

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

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

于 2012-12-20T21:43:17.290 回答
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个参数,the Domain, the Expires, and the Value

类似的问题和答案:
使用相同登录数据库的多个应用程序相互注销
asp.net forms authentication 在登录到另一个实例时注销

于 2012-12-22T19:18:51.753 回答
0

Put these two statements

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

after

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

May be the UserLogin method is resetting the Session variables. Hope it Helps :)

于 2012-12-27T11:13:53.923 回答