2010-09-15 16 views
31

Chcę usunąć "returnurl =/blabla" z paska adresu, gdy użytkownik chce uzyskać dostęp do strony logowania. Ponieważ próbuję przekierować użytkownika na statyczną stronę po zalogowaniu, aby dokonać pewnych wyborów.Jak usunąć kod powrotu z adresu URL?

Jak mogę to zrobić?

Odpowiedz

20

Jest to charakter Forms Authentication. (które im się domyślam).

Oznacza to, że po uzyskaniu dostępu do strony wymagającej uwierzytelnienia program ASP.NET przekieruje użytkownika do strony logowania, przekazując parametr ReturnUrl jako parametr, dzięki czemu można powrócić do strony, z której pochodzi użytkownik po zalogowaniu.

Aby usunąć tę funkcję, złamie się semantyka i projekt samego uwierzytelniania formularzy. (IMO)

Moja sugestia - jeśli jej nie potrzebujesz, nie używaj jej.

Próbuję przekierować użytkownika do statycznej strony po zalogowaniu się zrobić kilka wyborów.

Bułka z masłem - po zrobiłeś swój login, zamiast robić FormsAuthentication.RedirectFromLoginPage (który używa bardzo ReturnURL że parametr kwerendy), wystarczy użyć FormsAuthentication.SetAuthCookie i przekierować gdzie chcesz.

+0

FormsAuthentication.SetAuthCookie to co robię właściwą now.I prostu chcesz go usunąć z paska adresu. –

+0

Potem pojawia się mój pierwszy komentarz - równie dobrze możesz nie używać w ogóle uwierzytelniania formularzy. Nie ma prostego sposobu na zrobienie tego (o czym wiem). Pamiętaj, że DOWOLNA strona może przekierować na stronę logowania (i program ASP.NET to robi). Jedynym sposobem, jaki mogę wymyślić jest podłączenie się do zdarzenia Global.asax i przepisanie adresu URL. Dlaczego obchodzi Cię, czy jest tam URL? – RPM1984

+0

i ten komentarz jest sprzeczny z twoim komentarzem "Ponieważ próbuję przekierować użytkownika na statyczną stronę po zalogowaniu, aby dokonać pewnych wyborów.". ReturnURL nie uniemożliwi ci wykonania własnego przekierowania po zalogowaniu, CHYBA nie używasz RedirectFromLoginPage, o którym powiedziałeś, że nie jesteś. Więc nie wiem, jaki masz problem. W jaki sposób funkcja ReturnUrl uniemożliwia wykonanie przekierowania? – RPM1984

8

Jak RPM1984 wskazał, nie trzeba przekierować użytkownika do określonego adresu URL po zalogowaniu się.

Jeśli jest to konieczne, aby usunąć parametr ReturnUrl ciągu kwerendy istnieje kilka opcji. Prawdopodobnie najłatwiej jest w swojej stronie logowania/kontrolerze sprawdzić, czy istnieje ReturnUrl parametr w kolekcji Request.QueryStrings. Jeśli istnieje, możesz wykonać przekierowanie z powrotem na stronę logowania, ale bez numeru ReturnUrl.

Inną opcją byłoby utworzenie niestandardowej implementacji dla FormsAuthenticationModule, która jest klasą, która obsługuje uwierzytelnianie użytkownika na podstawie jego biletu uwierzytelniania formularza i jest odpowiedzialna za przekierowanie nieautoryzowanych użytkowników do strony logowania. Niestety, metody klasy FormsAuthenticationModule nie są wirtualne, więc nie można utworzyć klasy pochodnej i zastąpić potrzebnych metod, ale dobrą wiadomością jest to, że klasa jest całkiem prosta - może w sumie 100-200 linii kodu i użycie Odbłyśnik można szybko utworzyć własną niestandardową klasę FormsAuthenticationModule. Jeśli pójdziesz tą trasą (której nie polecałbym), wszystko, co musisz zrobić, to wyjąć kod w metodzie OnLeave, która jest zbindowana na parametrze ReturnUrl. (Oprócz modyfikowania tej klasy należy również skonfigurować plik Web.config, aby aplikacja korzystała z niestandardowej klasy FormsAuthenticationModule, a nie w systemie .NET Framework.)

Happy Programming!

10

Tworzenie niestandardowej autoryzacji Atrybut

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(
         AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string loginUrl = "/"; // Default Login Url 
      filterContext.Result = new RedirectResult(loginUrl); 
     } 
    } 
} 

następnie używać go na kontrolerze

[CustomAuthorizeAttribute] 
public ActionResult Login() 
{ 


    return View(); 
} 
+2

Preferuję to rozwiązanie, chociaż uważam, że bardziej sensowne jest posiadanie kodu w 'HandleUnauthorizedRequest' i użycie tego wiersza zamiast' filterContext.Result = new RedirectResult (FormsAuthentication.LoginUrl); ' –

2

Dodaj znacznik lokalizacji do web.config. Jeśli twoja strona znajduje się w podkatalogu, dodaj web.config do podkatalogu.

<location path="ForgotPassword.aspx"> 
    <system.web> 
     <authorization> 
      <allow users="*"/> 
     </authorization> 
    </system.web> 
</location> 

ASP przeoczy dodanie do zapytania kwerendy ReturnUrl i przekierowanie do logowania.

+0

wow, miałem ten problem zobacz tutaj http : //stackoverflow.com/questions/19301787/asp-net-links-wont-redirect-to-the-right-page Dzięki temu pomógł mi i mieliśmy tę samą nazwę strony :) – meda

12

Dodaj to do swojego pliku Global.asax.

public class MvcApplication : HttpApplication { 

    private const String ReturnUrlRegexPattern = @"\?ReturnUrl=.*$"; 

    public MvcApplication() { 

    PreSendRequestHeaders += MvcApplicationOnPreSendRequestHeaders; 

    } 

    private void MvcApplicationOnPreSendRequestHeaders(object sender, EventArgs e) { 

    String redirectUrl = Response.RedirectLocation; 

    if (String.IsNullOrEmpty(redirectUrl) 
     || !Regex.IsMatch(redirectUrl, ReturnUrlRegexPattern)) { 

     return; 

    } 

    Response.RedirectLocation = Regex.Replace(redirectUrl, 
               ReturnUrlRegexPattern, 
               String.Empty); 

    } 
+0

http: // stackoverflow. com/questions/13394999/create-authentication-and-urr-redriting Korzystam z uwierzytelniania formularzy niestandardowych. Jeśli użyję kodu, który dałeś pętle kontrolne w kółko i mówi i "Too many Redirects". Myślę, że problem polega na tym, że gdy Control przejdzie do strony "Login", takiej jak "mywebsite.com/Login", to sprawdza, czy nie została uwierzytelniona i przekierowuje na stronę "Login.aspx". a twój kod przekierowuje ponownie na stronę "Login". Ta pętla jest kontynuowana. Czy możesz mi z tym pomóc ??? –

+0

Czy nie potrzebujemy ': base()' w konstruktorze MvcApplication? – Roberto

1

jeśli używasz sterowania LoginStatus asp.net następnie kliknij na status logowania prasowej kontrola F4 (dla właściwości) w sekcji behawioralnej widzimy LogOutAction tam wybrać Przejdź do strony logowania.

Uwaga: W celu wdrożenia go pomyślnie, trzeba mieć stronę logowania z nazwą Login.aspx

+0

nazywa się to "Przekierowanie do strony logowania" (w znacznikach jest to LogoutAction = "RedirectToLoginPage") –

8

proste ...

[AllowAnonymous] 
public ActionResult Login() { return View(); } 

[AllowAnonymous] 
public ActionResult LoginRedirect(){ return RedirectToAction("Login"); } 

webconfig

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LoginRedirect" timeout="2880" /> 
</authentication> 
+0

W moim przypadku musiałem zmienić ścieżkę w startup.auth.cs, a nie w konfiguracji sieci: 'app.UseCookieAuthentication (new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString (("/ konto/LoginRedirect")), ... ' użyłem również RedirectToActionPermanent zamiast RedirectToAction bo to pernament –

+0

jest to dobre rozwiązanie. - Jedynym zastrzeżeniem jest to, że będziesz mieć prośbę o LoginRedirect w historii przeglądarki, więc jeśli ktoś raz kliknie przycisk Wstecz, przywróci go do LoginRedirect, a następnie z powrotem do logowania. – Jim

-1
protected void LoginControl_LoggedIn(object sender, EventArgs e) 
{ 
    Response.Redirect("~/selection.aspx"); 
} 
0
void Application_BeginRequest(object s, EventArgs e) 
{ 
    // ................ 

    // strip return Return Url 
    if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"]) && Request.Path.IndexOf("login.aspx")!=-1) 
     System.Web.HttpContext.Current.Response.Redirect("~/login.aspx"); 
0

Możesz użyć HttpUtility.ParseQueryString, aby usunąć ten element. Jeśli używasz VB.NET następnie ten kod robi to

Dim nvcQuery As NameValueCollection 
Dim strQuery As String = "" 

If Not IsNothing(Request.QueryString("ReturnUrl")) Then 
    If Request.QueryString("ReturnUrl").Length Then 
     nvcQuery = HttpUtility.ParseQueryString(Request.QueryString.ToString) 
     For Each strKey As String In nvcQuery.AllKeys 
      If strKey <> "ReturnUrl" Then 
       If strQuery.Length Then strQuery += "&" 
       strQuery += strKey + "=" + nvcQuery(strKey) 
      End If 
     Next 
     If strQuery.Length Then strQuery = "?" + strQuery 
     If Request.CurrentExecutionFilePath <> "/default.aspx" Then 
      Response.Redirect(Request.CurrentExecutionFilePath + strQuery) 
     Else 
      Response.Redirect("/" + strQuery) 
     End If 
     Response.Write(Server.HtmlEncode(strQuery)) 
    End If 
End If 

chciałbym umieścić to w przypadku Page.Init - oczywiście trzeba będzie zmienić „/default.aspx”, aby dopasować adres URL strony logowania .

1

Jeśli chcesz usunąć returnURL z żądania i przekierować do określonej ścieżki, możesz wykonać te kroki.

Najpierw pobierz bieżący kontekst, sprawdź, czy użytkownik jest uwierzytelniony i ostatecznie przekieruj bieżącą ścieżkę.

HttpContext context = HttpContext.Current; 
     //verify if the user is not authenticated 
     if (!context.User.Identity.IsAuthenticated) 
     { 
      //verify if the URL contains ReturnUrl 
      if (context.Request.Url.ToString().Contains("ReturnUrl")) 
      { 
       //redirect the current path 
       HttpContext.Current.Response.Redirect("~/login.aspx"); 
      } 

     } 

umieścić ten kod w metodzie Page_Load z mojej klasy Login.aspx.cs

Powiązane problemy