关于asp.net mvc 4:允许管理员使用iframe模仿用户

Allow Administrators to impersonate users using an iframe

我有一个具有三个角色的MVC项目:用户,帐户管理员和管理员。

管理员拥有自己的MVC区域,可以在其中完全控制用户和帐户管理员。我正在尝试实现允许管理员以任何用户或帐户管理员的身份查看网站的功能。

在网站的"管理区域"中,我有一个"用户和帐户管理员"列表的视图。该列表为每个记录包含一个"以用户身份查看网站"按钮。

我以前从未做过这样的事情,但是当前已设置ViewAs Controller Action来创建具有所选用户信息的Session,如下所示:

1
2
3
4
5
6
7
8
ViewBag.SiteSession = Session["SiteSession"] = new SiteSession()
{
    ID = user.ID,
    AccountID = user.AccountID,
    DisplayName = user.DisplayName,
    IsManager = user.IsAdmin,
    IsAdmin = false
};

与该动作相关的View的Model定义为string,除带有Model作为src属性的iframe之外别无其他,如下所示:

1
2
3
4
@model string
<iframe src="@Model">

</iframe>

我想做的是渲染此iframe中请求的网站的任何部分。管理员单击"以用户身份查看"时,我想转到首页。 URL是通过以下调用生成的:

1
Url.Action("Index","Home", new { Area ="" }));

区域设置为无,以避免呈现管理区域的主页。

目前,这不起作用。我不知道从哪里开始,减去我已经拥有的。

我正在寻找任何建议。非常感谢所有帮助,因为这似乎并不容易。

如果您不知道如何提供帮助,也可以将这个问题转给可以帮助的人。

再次感谢您。


我过去这样做的方式一直是使用实际用户和有效用户的概念。大多数显示操作都使用有效的用户来生成其内容。通常,我将其实现为"模拟"而不是"预览",因此用户实际上是在以用户身份浏览网站,而不是在单独的窗口中显示。在这种情况下,我只需在当前会话中同时设置两者即可。需要管理员权限的事物(例如切换至模拟用户/从模拟用户切换)显然会使用真实用户。

如果您想进行预览,那么我会考虑在每个请求上使用一个参数来设置有效用户。代码需要理解将此参数添加到所有链接,以便您可以在iframe中进行导航而不会弄乱原始界面中的导航。

至于从网址中删除该区域,我认为您所拥有的(设置为空字符串)应该可以工作。如果不起作用,则可能要尝试使用小写的areaUrl.Action("Index","Home", new { area ="" })。我很确定在引擎盖下创建的RouteValueDictionary使用不区分大小写的键比较,因此没关系。


对于此任务,我最终创建了一个单独的控制器ViewAsController,该控制器具有控制器范围的[Authorize]属性,该属性仅允许具有Admin角色的用户访问其操作。

Start操作中,将创建一个包含所选用户信息的Session对象,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
[HttpGet]
public ActionResult Start(int id)
{
    var user = db.Users
        .First(u => u.ID == id);

    Session["SiteSession"] = new SiteSession()
    {
        //Session data...
    };

    return PartialView("_IFrame");
}

这个动作返回一个局部视图,最终我显示在jQuery UI模态对话框窗口中。

这是该部分视图的代码:

1
2
3
4
5
6
@{
    ViewBag.SiteSession = (SiteSession)Session["SiteSession"];
}
Viewing Site As @ViewBag.SiteSession.DisplayName

    <iframe src="@Url.Action("Index","Home", new { Area ="" })"></iframe>

如您所见,它非常裸露,而这正是需要的。