我有一个网站,允许一些用户作为其他用户代理。当他们这样做时,他们应该看到整个站点,就像他们代理的用户所在的位置一样。我通过更改当前用户对象来做到这一点
internal static void SetProxyUser(int userID)
{
HttpContext.Current.User = GetGenericPrincipal(userID);
}
这段代码对我来说很好。
在站点上,为了代理,用户在我的 _layout 文件中呈现的下拉列表中选择一个值,以便它出现在所有页面上。
@Html.Action("SetProxyUsers", "Home")
SetProxyUsers 视图如下所示:
@using (@Html.BeginForm("SetProxyUsers", "Home")) {
@Html.DropDownList("ddlProxyUser", (SelectList)ViewBag.ProxyUsers_SelectList, new { onchange = "this.form.submit();" })
}
对此的控制器操作如下所示
[HttpGet]
public ActionResult SetProxyUsers()
{
ViewBag.ProxyUsers_SelectList = GetAvailableProxyUsers(originalUserID);
return PartialView();
}
[HttpPost]
public ActionResult SetProxyUsers(FormCollection formCollection)
{
int id = int.Parse(formCollection["ddlProxyUser"]);
RolesHelper.SetProxyUser(id);
ViewBag.ProxyUsers_SelectList = GetAvailableProxyUsers(originalUserID);
return Redirect(Request.UrlReferrer.ToString());
}
所有这些都有效(除了 originalUserID 变量,我放在这里以象征我接下来要做什么。
我的问题是下拉列表中的值是基于登录用户的。因此,当我使用代理更改用户时,我还会更改代理下拉列表中的值(如果不允许“新”用户进行代理,则要么消失,要么显示“新”用户的可用代理用户列表)。
我需要让这个选择列表保持不变。如何存储原始用户的 ID?我可以将它存储在会话变量中,但我不想弄乱潜在的超时问题,所以这是最后的手段。
请帮忙,如果问题有任何不清楚的地方,请告诉我。
更新
我没有意识到HttpContext
每个帖子都设置了。我之前并没有真正使用过这种东西,并且出于某种原因假设我正在为整个会话设置值(愚蠢,我知道)。但是,我使用的是 Windows 身份验证。如何更永久地更改用户(只要浏览器处于打开状态)?我假设我不能使用 FormAuthentication cookie,因为我使用 windows 作为我的身份验证模式,对吗?