2008-10-08 9 views
7

Kimlik doğrulaması yapmadıysa kişileri bir giriş ekranına yönlendirmek için bir asp.net mvc sayfasındaki işlemlerimin bazılarında kimlik doğrulama özelliği kullanıyorum. Sorunum onları giriş yaptıktan sonra yönlendiren sayfaya döndürüyor. Sadece yönlendiren eylemi ve yönlendiren denetleyiciyi takip ediyordum, ancak bazı parametrelerin kaydını tutmam gerektiğinde sorunlu hale geliyor. Bilmediğim hile içinde bazı şıklar var mı?Yönlendirmeli sayfaya geri dön

cevap

3

Eğer ASP.NET oturum açma sayfasına bir kullanıcıyı yönlendirir FormsAuthentication, kullandığınız var dediği gibi

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 şuna benzer:

FormsAuthentication, mesela onu alıp yönlendirmek böylece
http://www.mysite.com/Login?ReturnUrl=/Something 

giriş formun işlem özniteliği (gibi gizli giriş veya Url bir parçası olarak ya) aynı ReturnUrl parametresi olmalıdır

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

veya

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

Bu sonuca ulaşmak için yaptığım şey aşırıya kaçmak olabilir ve diğer bazı yöntemleri de görmek isterim. Ancak, işte benim kodum.

Lütfen bir içerikle alay etmek için Moq kullanacağını unutmayın ... Ve daha önce querystring ile hiçbir şey yapmadım (yollarımda herhangi bir querystrings yok). Ben, belki biraz fazla karmaşık :) durumda

+0

Ek bir açıklama olarak, bazı routedata değerlerini değiştirmek için yukarıdaki kodu da kullanıyorum. – Casper

0

Hep atıfta URL'ler kendi etki ve nereden geliyor olabilir dair akla yatkın dize içinde olmasını sağlamalıdır. Aksi taktirde, flaş veya diğer istemci taraf teknolojileriyle, bilinen ve bilinmeyen, yanıt bölme veya diğer saldırılar gibi şeyler yapmak için kullanılma potansiyeline sahiptir.

HTTP yönlendiricisi, kullanıcı girdisidir ve başkaları gibi doğrulanmalıdır.