2010-12-10 3 views
1

저는 ASP.NET 웹 MVC2 웹 응용 프로그램을 사용하여 새 MVC2 프로젝트를 만들었습니다.이 웹 응용 프로그램은 기본 웹 사이트를 제공합니다. 홈 컨트롤러와 인덱스보기가있는 간단한 영역을 추가했습니다. 그 컴파일러와 함께 첫 번째 문제를 cuased "여러 유형이 컨트롤러 이름 '홈'과 일치하는 발견되었습니다" ". 나는 Main을 Main으로 바꾸었고 컴파일되었다.UrlReferrer를 사용하여 영역 내 호출 페이지로 돌아 가기

새 탭을 추가하여 내 지역의 인덱스보기를 참조하고 웹 사이트를 열고 탭을 클릭하기 시작했습니다. 나는 지역 인덱스 페이지를 방문했을 때 다음과 같이 나는 다시 홈 또는 페이지 정보 메뉴를 변경하지 않고 갈 수 없었다 :

<ul id="menu">    
    <li><%= Html.ActionLink("SampleArea.Main", "Index", "Main", new { area = "SampleArea" }, null)%></li> 
    <li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li> 
    <li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li> 
</ul> 

I 수 후 정확하게 탭을 순환. 나는 사용자가 로그 오프 할 경우 호출 페이지로 돌아 UrlReferrer.AbsolutePath을 사용하고

public ActionResult LogOff() 
{ 
    FormsService.SignOut(); 

    //return RedirectToAction("Index", "Home"); 
    return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString()); 
} 

다음과 같이 나는 다음 계정 컨트롤러에서 로그 오프보기에서 코드를 변경했습니다. 호출 페이지가 View in SampleArea이면, .AbsolutePath는 "/ SampleArea"를 포함합니다. 이것은 컨트롤러와 뷰가 기본값이기 때문에 포함되지 않기 때문입니다. 계속 진행될 때 다음과 같은 오류 메시지가 나타납니다.

리소스를 찾을 수 없습니다.
설명 : HTTP 404 자원 가 제거되었거나 수 찾고 (또는 종속성 중 하나)되어있다가, 는 이름이 변경되었거나 일시적으로 사용할 수 없습니다 입니다. 다음 URL을 검토하고 의 철자가 올바른지 확인하십시오.

요청 된 URL :/계정/SampleArea

나의 이해는 그것이 로그 오프가 실행 된 시점의 컨트롤러이기 때문에 계정이 추가되었습니다/점이다. 그것은/SampleArea가 동작이라고 생각하고 따라서 현재 컨트롤러를 추가하여 경로를 완료합니다.

UrlReferrer.AbsolutePath를 사용하면 SampleArea를 영역으로 지정할 수있는 방법이 있습니까? 아니면 올바른 페이지로 돌아 가기 위해 할 수있는 다른 방법이 있습니까?

새로운 추가
이것은 내가 생각한 것보다 더 이상합니다. 현재 개발중인 웹 사이트를 열고 AbsolutePath를 사용하여 반환하도록 LogOut보기에서 return 문을 변경했습니다. 중단 점에 "/ Club/PrivacyPolicy"가 포함되어 있음을 나타냅니다.

요청 된 URL : 그러나, 나는 다음과 같은 차이가 동일한 오류 메시지 수/로그인/클럽/PrivacyPolicy 땅에서해야 오히려, 뷰 ​​인/로그인으로 접두사 왜

/계정 컨트롤러보다? 실제로 접두사에 접두사를 붙이면 안되는 이유는 무엇입니까?/Club/PrivacyPolicy 은 Global.asax.cs에서 유효한 경로입니다.

+1

이 질문에 직접 대답하지 않지만 일부 프록시 서버 및 방화벽으로 보안 조치로 응답에서 그것을 제거 할 때 UrlReferrer에주의해야합니다. – JasonS

+0

왜 그런가요? 확실하게 시스템에 의해 값이 설정되었으므로 악의적 인 주입에 대한 제안이 없어야합니다. – xiecs

+0

리퍼러는 방화벽, 바이러스 백신, 프록시 등으로 잘려지기 때문에 코드 논리를이 데이터에 의존해서는 안됩니다. – zerkms

답변

0

마지막으로 LogOn 또는 LogOut 요청을 트리거했을 때의 페이지로 돌아가는 방법을 알아 냈습니다. 다음 코드를 사용했습니다.

Html.ActionLink("Member LogOn", "LogOn", "Account", new { area = "", returnUrl = HttpContext.Current.Request.RawUrl }, null) 

이것은 예컨대

<a href='/LogIn/LogOn?returnUrl=%2FContactUs'>Member LogOn</a> 

를 생성한다. 내 HttpPost ActionResult 로그온에서

, 그때

if (!String.IsNullOrEmpty(returnUrl)) 
{ 
    return Redirect(returnUrl); 
} 
    else 
{ 
    return RedirectToAction("Index", "Home"); 
} 

이 가끔 난 그냥 HttpContext.Request.RawUrl 필요 찾을 수 있습니다.

/Account/LogOn 대신 LogIn/LogOn이 생성 된 이유는 확실하지 않지만 예상대로 작동합니다.

+0

/Account/LogOn 대신/LogIn/LogOn이있는 이유를 발견했습니다. View 이름에 대해 LogIn에서 LogOn으로 변경했지만 Global.aspx에서 라우팅 정의를 변경하지 않았습니다. 내가 그것을 바꾼 후에는/Account/LogOn이되었다. – xiecs

+0

위의 코드는 Open Redirection 공격을 유발할 수 있습니다. MVC3에서 "if (! String.IsNullOrEmpty (returnUrl))"는 "if (Url.IsLocalUrl (returnUrl))"로 코딩해야합니다. 이것은 Jon Galloway의 최신 블로그의 호의입니다. – xiecs

관련 문제