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
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öylecehttp://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>
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
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.
Ek bir açıklama olarak, bazı routedata değerlerini değiştirmek için yukarıdaki kodu da kullanıyorum. – Casper