Używam atrybutu uwierzytelniania w niektórych moich działaniach na stronie mvc asp.net, aby odsyłać użytkowników do ekranu logowania, jeśli nie zostali uwierzytelnieni. Moim problemem jest zwrócenie ich na stronę odsyłającą po zalogowaniu. Po prostu śledziłem akcję odsyłającą i odnoszę się do kontrolera, ale to staje się problematyczne, gdy muszę również śledzić niektóre parametry. Czy jest jakiś fajny sztuczka, o której nie wiem?Powrót do strony z odnośnikami
Odpowiedz
W przypadku używasz FormsAuthentication, gdy ASP.NET przekierowuje użytkownika na stronę logowania, URL wygląda mniej więcej tak:
http://www.mysite.com/Login?ReturnUrl=/Something
Atrybut działania formularza logowania powinien mieć ten sam parametr ReturnUrl (jako wejście ukryte lub jako część adresu URL), aby FormsAuthentication mogło go odebrać i przekierować, np.
<form action="Login?ReturnUrl=<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"]) %>"></form>
lub
<form><input type="hidden" name="ReturnUrl" id="ReturnUrl" value="<%=Html.AttributeEncode(Request.QueryString["ReturnUrl"])"%> /></form>
To, co zrobiłem, aby osiągnąć ten wynik, może być przesadzone, i chciałbym zobaczyć również inne metody. Jednak oto mój kod.
Pamiętaj, że używasz Moq do kpienia z kontekstu ... I jeszcze nie zrobiłem nic z querystringiem (moje trasy nie zawierają żadnych zapytań).
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);
}
Jak powiedziałem, to może trochę zbyt skomplikowana :)
Zawsze należy upewnić się, że adres URL jest odnosząc się w obrębie domeny i wiarygodne sznurka, które mogłyby być one pochodzą. W przeciwnym razie może to być wykorzystane w połączeniu z technologiami flash lub innymi technologiami po stronie klienta, takimi jak dzielenie odpowiedzi lub inne ataki, znane i nieznane.
Odnośnik HTTP to dane wprowadzane przez użytkownika i powinien zostać zatwierdzony, tak jak każdy inny.
- 1. Powrót ActionResult do strony, która go nazwała:
- 2. Kontroler kodowania Powrót do poprzedniej strony
- 3. php powrót do strony po przedłożeniu formularza
- 4. VBA: powrót numer strony z selection.find pomocą tekstu z tablicy
- 5. Powrót do strony {AppName} nie wyświetla się | iOS9 OpenURL
- 6. Powrót do obserwowania z subskrypcji
- 7. Powrót z kontrolera do poprzedniego
- 8. Przekierowanie/powrót do tej samej (poprzedniej) strony w Django?
- 9. Unikanie sprzężeń z tabelami referencyjnymi/odnośnikami w Doctrine 2
- 10. Holder.js - Powrót do DOM?
- 11. Powrót C++ do Pythona?
- 12. jQuery - powrót do góry
- 13. Powrót do widoku z Async Oczekiwanie na
- 14. vim: C++ powrót do wcięcia z #
- 15. Najlepsze praktyki zabezpieczania powrót do poprzedniej strony po zalogowaniu lub z powrotem link URL
- 16. Powrót z kontekstu powyżej
- 17. Powrót wiadomości z postgresu
- 18. Powrót z obietnicą następnie()
- 19. Zapobieganie przeładowaniu strony przez przeglądarkę, gdy użytkownik uderzy Powrót
- 20. iOS: powrót do poprzedniego widoku
- 21. UINavigationController powrót do pierwszego widoku
- 22. przekierować do ActionResult w MVC, ale nie chcą, aby przejść do strony przez widoku Powrót()
- 23. AngularJS $ routeProvider, powrót do domyślnej nawigacji linku
- 24. Przekierowanie z strony z obrazami na Facebooku do strony internetowej
- 25. Powrót do działania rekursywnego (podobnie do FileSystem)
- 26. Powrót JSON z obsługi Takod
- 27. Powrót do głównej aktywności z działań związanych z tworzeniem powiadomień
- 28. Wcześniejszy powrót z konstruktora Scala
- 29. Powrót z argumentem wewnątrz generatora
- 30. java - tablica powrót z metody
Tak samo jako dodatkowy komentarz, używam również powyższego kodu do modyfikowania niektórych wartości routedata. – Casper