2013-08-02 2 views
1

사용자, 계정 관리자 및 관리자의 세 가지 역할을 가진 MVC 프로젝트가 있습니다.관리자가 iframe을 사용하여 사용자로 가장 할 수 있도록 허용

관리자는 사용자와 계정 관리자를 완전히 제어 할 수있는 자체 MVC 영역을 가지고 있습니다. 관리자가 사이트를 모든 사용자 또는 계정 관리자로 볼 수있는 기능을 구현하려고합니다.

사이트의 관리 영역에는 사용자 및 계정 관리자 목록이 있습니다. 목록에는 각 레코드에 대한 "사용자로 사이트보기"버튼이 있습니다.

내가 전에 같이 일을 해본 적이없는,하지만 ViewAs 컨트롤러 액션이 현재과 같이 선택된 사용자의 정보와 함께 세션을 생성하도록 설정되어

:이 작업이있다

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

보기 관련에 string로 정의 모델, 그리고 아무것도하지만, 그래서 같은 src 속성으로 모델과 iframe이는 :

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

</iframe> 

난 할 노력하고있어 요청했다 사이트의 어느 부분 렌더링 이 iframe에서 ed. 관리자가 "사용자로보기"를 클릭하면 집으로 이동하고 싶습니다. URL은 다음 호출을 통해 생성됩니다.

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

이 영역은 관리 영역의 홈 렌더링을 피하기 위해 아무 것도 설정되지 않습니다.

현재로서는 작동하지 않습니다. 나는 이미 어디에서부터 시작해야할지 모르겠다.

나는 어떤 제안이있어 찾고있다. 이것이 쉬운 일로 보이지 않기 때문에 모든 도움을 크게 받으실 수 있습니다.

당신이 도울 수있는 방법을 모르는 경우,이 질문을 할 수있는 사람에게 할 수 있으면 감사하게 생각합니다.

다시 감사드립니다.

답변

0

이 작업에서는 컨트롤러 역할을 가진 사용자 만 해당 작업에 액세스 할 수있는 컨트롤러 전체 [Authorize] 속성이있는 별도의 컨트롤러 ViewAsController을 만들었습니다.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 호출 될 때까지 열리지 않습니다 것을 여기에서 볼 수 있습니다 부분 뷰를 검색하는 작업이 성공적으로 완료되었습니다. 나는 확실히 "미리보기"나는에서 실제로 잘 모르겠어요 싶지 않아

[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

: 관리자 대화 상자를 닫으면

, 서버는 세션을 파괴의 ViewAs 컨트롤러에서 End 조치를 호출 당신이 그것을 유추 한 곳. 본질적으로 사용자를 가장하고 싶습니다. – Kehlan

+0

원래 인터페이스를 그대로 유지하면서 iframe에서 개별적으로 표시하므로 "미리보기"라고했습니다. 어쩌면 내 용어가 틀렸을 수도 있지만, 가장이라는 의미는 원래 인터페이스가 가장 된 사용자로 표시되도록 변경하는 것입니다 (가장을 중지하는 기능이 유일한 차이점 임). 요청 매개 변수가없는 서버에서 iframe/enclosing 창에서 요청한 요청의 차이를 알 수있는 방법이 없기 때문에 단계별로 가장하는 것이 어려워집니다. – tvanfosson

관련 문제