2013-08-02 5 views
1

У меня есть проект MVC с тремя ролями: пользователями, менеджерами учетных записей и администраторами.Разрешить администраторам олицетворять пользователей с помощью iframe

Администраторы имеют свою собственную зону MVC, где они имеют полный контроль над пользователями и менеджерами учетных записей. Я пытаюсь реализовать функции, позволяющие администраторам просматривать сайт как любой пользователь или менеджер аккаунта.

В области администратора сайта у меня есть список пользователей и менеджеров учетных записей. Список содержит кнопку «View Site As User» для каждой записи.

Я никогда не делал ничего подобного, но ViewAs Действие контроллера в настоящее время создана для создания сеанса с информацией о выбранном пользователе, например, так:

ViewBag.SiteSession = Session["SiteSession"] = new SiteSession() 
{ 
    ID = user.ID, 
    AccountID = user.AccountID, 
    DisplayName = user.DisplayName, 
    IsManager = user.IsAdmin, 
    IsAdmin = false 
}; 

Взгляд отношение к этому действию имеет Модель определяется как string, и ничто иное, как IFrame с моделью в качестве атрибута src, например, так:

@model string 
<iframe src="@Model" > 

</iframe> 

То, что я пытаюсь сделать, это делает какой бы часть сайта была просьба в этом iframe. Когда администратор нажимает «Просмотр как пользователь», я хотел бы перейти на главную страницу. URL-адрес генерируется через этот звонок:

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

Район не имеет ничего общего с тем, чтобы не доставлять Дом Администратора.

В настоящее время это не работает. Я не знаю, с чего начать, минус, что у меня уже есть.

Я ищу любые предложения. Вся помощь очень ценится, так как это не похоже на легкую задачу.

Если вы не знаете, как помочь, было бы также полезно, если бы вы могли направить этот вопрос кому-то, кто может это сделать.

Опять же, спасибо заранее.

ответ

0

Для этой задачи я закончил создание отдельного контроллера ViewAsController, который имел атрибут [Authorize] контроллера, который позволял пользователям с ролью администратора получать доступ к его действиям.

В Start действие, Session объект, содержащий информацию о выбранном пользователе создается, например, так:

[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.

Вот код для этого частичного вида:

@{ 
    ViewBag.SiteSession = (SiteSession)Session["SiteSession"]; 
} 
<h2>Viewing Site As @ViewBag.SiteSession.DisplayName</h2> 
<div> 
    <iframe src="@Url.Action("Index", "Home", new { Area = "" })"></iframe> 
</div> 

Как вы можете видеть, это очень голый, и это именно то, что она должна быть. действует как браузер в браузере, позволяя пользователю администратора получить полный доступ к тем действиям, которые выбрал выбранный пользователь.

Ради подробно, вот в JQuery, который создает диалоговое окно и открывает его:

$(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"); 
} 

Здесь можно увидеть, что диалог инициализируется на документ-готов, и не не открыт до вызова AJAX который получает Частичный просмотр, успешно завершен.

После Администратор закрывает диалог, сервер вызывает End действия в ViewAs контроллере, разрушив сессию:

[HttpPost] 
public ActionResult End() 
{ 
    Session["SiteSession"] = null; 

    return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK); 
} 
1

Способ, которым я это делал в прошлом, состоял в том, чтобы использовать концепцию фактического пользователя и эффективного пользователя. Большинство действий отображения используют эффективного пользователя для создания своего контента. Обычно я реализовал его как «олицетворение», а не «предварительный просмотр», поэтому пользователь фактически просматривает сайт как пользователь, а не отображает его в отдельном окне. В этом случае я просто устанавливаю оба в текущем сеансе. Вещи, требующие разрешения администратора (например, переключение на/из олицетворения), очевидно, используют реального пользователя.

Если вы хотите сделать предварительный просмотр, я бы подумал об использовании параметра для каждого запроса, чтобы установить эффективного пользователя. Код должен был бы понять, чтобы добавить этот параметр ко всем ссылкам, чтобы вы могли перемещаться в iframe, не нарушая навигацию в исходном интерфейсе.

Что касается удаления области с URL-адреса, я думаю, что у вас есть (установка пустой строки). Если он не работает, вы можете попробовать ввести нижний регистр area, Url.Action("Index", "Home", new { area = "" }). Я почти уверен, что RouteValueDictionary, созданный под капотом, использует нечувствительное к регистру сравнение ключей, однако, это не имеет значения.

+0

Я определенно не хочу «Предварительный просмотр» Я на самом деле не уверен, что из где вы это сделали. Я хочу по существу выдавать себя за пользователей. – Kehlan

+0

Я назвал его «предварительным просмотром», так как вы показываете отдельно в iframe, сохраняя оригинальный интерфейс неповрежденным. Может быть, моя терминология ошибочна, но я подразумеваю под олицетворением, так это то, что вы просто изменили бы оригинальный интерфейс, чтобы отображать как олицетворенного пользователя (с возможностью прекратить олицетворение, являясь единственной разницей). Олицетворение бок о бок кажется сложнее, так как на сервере нет способа без параметра запроса, чтобы рассказать разницу между запросами из окна iframe/enclosing. – tvanfosson

Смежные вопросы