2008-10-08 10 views
7

인증되지 않은 경우 사람들을 로그인 화면으로 안내하기 위해 asp.net mvc 페이지의 일부 작업에 인증 속성을 사용하고 있습니다. 내 문제는 그들이 로그인 한 후 참조 페이지로 그들을 반환하고 있습니다. 나는 단지 참조 동작 및 참조 컨트롤러를 추적하고 있었지만 일부 매개 변수를 추적해야 할 때 문제가됩니다. 내가 알지 못하는 어떤 멋진 트릭이 있나요?참조 페이지로 돌아 가기

답변

3

당신이 ASP.NET 로그인 페이지로 사용자를 리디렉션하고 FormsAuthentication를 사용하고있어 말했듯이

var urlReferrer = Request.UrlReferrer; 
if (urlReferrer != null) 
{ 
    var url = "~" + Server.UrlDecode(urlReferrer.PathAndQuery); 

    // get routecollection 
    var routeCollection = new RouteCollection(); 
    GlobalApplication.RegisterRoutes(routeCollection); 

    // mcok context 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    context.Expect(ctx => ctx.Request).Returns(request.Object); 

    // mock request 
    // TODO: convert querystring to namevaluecollection 
    // now it's just stripped 
    if (url.IndexOf('?') > 0) 
    { 
     url = url.Substring(0, url.IndexOf('?')); 
    } 

    var mock = Mock.Get(context.Object.Request); 

    // TODO: insert namevaluecollection of querystring 
    mock.Expect(req => req.QueryString).Returns(new NameValueCollection()); 
    mock.Expect(req => req.AppRelativeCurrentExecutionFilePath).Returns(url); 
    mock.Expect(req => req.PathInfo).Returns(string.Empty); 

    // get routedata with mocked context 
    var routeData = routeCollection.GetRouteData(context.Object); 
    var values = routeData.Values; 

    return RedirectToAction(routeData.Values["action"].ToString(), values); 
} 

는 URL은 다음과 같은 :

있는 FormsAuthentication는, 예를 데리러하고 리디렉션 할 수 있도록
http://www.mysite.com/Login?ReturnUrl=/Something 

로그인 양식의 작업 속성 (숨김 입력 또는 URL의 일부로서 하나를) 같은 ReturnUrl 매개 변수를 가져야한다

<form action="Login?ReturnUrl=<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"]) %>"></form> 

또는

<form><input type="hidden" name="ReturnUrl" id="ReturnUrl" value="<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"])"%> /></form> 
2

나는 그 결과를 달성하기 위해 무엇을했는지 모르겠으며, 다른 방법도보고 싶습니다. 그러나 여기에 내 코드가있다.

문맥을 모의하기 위해 Moq을 사용하고 있습니다 ... 그리고 아직 쿼리 문자열을 사용하지 않았습니다 (내 경로에는 쿼리 문자열이 포함되어 있지 않습니다). 나는, 그것은 어쩌면 조금 overcomplicated : 경우

+0

추가 의견으로, 위의 코드를 사용하여 일부 routedata 값을 수정하십시오. – Casper

0

당신은 항상 참조 URL 도메인 그들은에서 오는 될 수 있다는 그럴듯한 문자열 내에 있는지 확인해야합니다. 그렇지 않으면 플래시 나 다른 클라이언트 측 기술과 함께 응답 분할 또는 알려진 공격과 알려지지 않은 공격을 수행 할 가능성이 있습니다.

HTTP 리퍼러는 사용자 입력이며 다른 것과 마찬가지로 유효성을 검사해야합니다.

관련 문제