Allow Administrators to impersonate users using an iframe
我有一个具有三个角色的MVC项目:用户,帐户管理员和管理员。
管理员拥有自己的MVC区域,可以在其中完全控制用户和帐户管理员。我正在尝试实现允许管理员以任何用户或帐户管理员的身份查看网站的功能。
在网站的"管理区域"中,我有一个"用户和帐户管理员"列表的视图。该列表为每个记录包含一个"以用户身份查看网站"按钮。
我以前从未做过这样的事情,但是当前已设置
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定义为
1 2 3 4 | @model string <iframe src="@Model"> </iframe> |
我想做的是渲染此iframe中请求的网站的任何部分。管理员单击"以用户身份查看"时,我想转到首页。 URL是通过以下调用生成的:
1 | Url.Action("Index","Home", new { Area ="" })); |
区域设置为无,以避免呈现管理区域的主页。
目前,这不起作用。我不知道从哪里开始,减去我已经拥有的。
我正在寻找任何建议。非常感谢所有帮助,因为这似乎并不容易。
如果您不知道如何提供帮助,也可以将这个问题转给可以帮助的人。
再次感谢您。
我过去这样做的方式一直是使用实际用户和有效用户的概念。大多数显示操作都使用有效的用户来生成其内容。通常,我将其实现为"模拟"而不是"预览",因此用户实际上是在以用户身份浏览网站,而不是在单独的窗口中显示。在这种情况下,我只需在当前会话中同时设置两者即可。需要管理员权限的事物(例如切换至模拟用户/从模拟用户切换)显然会使用真实用户。
如果您想进行预览,那么我会考虑在每个请求上使用一个参数来设置有效用户。代码需要理解将此参数添加到所有链接,以便您可以在
至于从网址中删除该区域,我认为您所拥有的(设置为空字符串)应该可以工作。如果不起作用,则可能要尝试使用小写的
对于此任务,我最终创建了一个单独的控制器
在
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> |
如您所见,它非常裸露,而这正是需要的。
为了详细起见,下面是创建对话框并打开它的jQuery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | $(function () { $("#viewAsDialog").dialog({ modal: true, autoOpen: false, resizable: true, draggable: true, closeOnEscape: false, height: $(window).height() * .9, width: 1000, closeText: '', close: function () { $.post("@Url.Action("End","ViewAs", new { Area ="Admin" })") .success(function (result) { }); } }); }); function viewAs(result) { $("#viewAsDialog").html(result); $("#viewAsDialog").dialog("open"); } |
您可以在此处看到该对话框已在准备好文档时初始化,并且在成功检索到Partial View的AJAX调用之前不会打开该对话框。
管理员关闭对话框后,服务器将在
1 2 3 4 5 6 7 | [HttpPost] public ActionResult End() { Session["SiteSession"] = null; return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK); } |