2010-09-15 1 views
31

Ich möchte "returnurl =/blabla" aus der Adressleiste entfernen, wenn ein Benutzer auf eine Login-Seite zugreifen möchte. Weil ich versuche, den Benutzer nach der Anmeldung auf eine statische Seite umzuleiten, um eine Auswahl zu treffen.So entfernen Sie Returnurl von der URL?

Wie kann ich das tun?

Antwort

20

Dies ist die Art von Formularauthentifizierung. (Was ich denke, Sie verwenden).

Wenn Sie auf eine Seite zugreifen, für die eine Authentifizierung erforderlich ist, leitet ASP.NET Sie zur Anmeldeseite weiter und übergibt die ReturnUrl als Parameter, sodass Sie zu der Seite zurückkehren können, von der Sie nach der Anmeldung gekommen sind.

Das Entfernen dieser Funktionalität würde die Semantik und das Design der Formularauthentifizierung selbst beeinträchtigen. (IMO)

Mein Vorschlag - wenn Sie es nicht brauchen, verwenden Sie es nicht.

Ich versuche, den Benutzer auf eine statische Seite nach der Anmeldung zu umleiten einige Auswahl zu tun.

Stück des Kuchens - nachdem Sie Ihre Anmeldung gemacht haben, anstatt das zu tun FormsAuthentication.RedirectFromLoginPage (die, dass es sehr ReturnUrl Abfrage-Zeichenfolge-Parameter verwendet), verwenden Sie einfach FormsAuthentication.SetAuthCookie und umleiten, wo immer Sie wollen.

+0

FormsAuthentication.SetAuthCookie ist, was ich tue genau das Richtige now.I es von Adressleiste entfernen möchten. –

+0

Dann steht mein erster Kommentar - Sie können die Formularauthentifizierung überhaupt nicht verwenden. Es gibt keinen einfachen Weg, dies zu tun (das weiß ich). Das Wiederhören JEDER Seite kann zur Anmeldeseite umleiten (und ASP.NET tut dies). Ich kann nur daran denken, sich in ein Global.asax-Event einzuklinken und die URL neu zu schreiben. Warum interessiert es dich, ob die URL da ist? – RPM1984

+0

und dieser Kommentar widerspricht Ihrem Kommentar "Weil ich versuche, den Benutzer nach der Anmeldung auf eine statische Seite umzuleiten, um eine Auswahl zu treffen." Die ReturnURL wird Sie nicht daran hindern, Ihre eigene Weiterleitung nach der Anmeldung auszuführen, sofern Sie nicht RedirectFromLoginPage verwenden, von dem Sie gesagt haben, dass Sie arent sind. Also ich weiß nicht, was dein Problem ist. Wie verhindert die ReturnUrl eine Weiterleitung? – RPM1984

8

Wie RPM1984 erwähnt, müssen Sie den Benutzer nicht an die angegebene URL umleiten nach der Unterzeichnung.

Wenn es, dass Sie die ReturnUrl Abfragezeichenfolgeflag Parameter gibt es Optionen, ein paar ist zwingend notwendig, entfernen. Wahrscheinlich am einfachsten ist in Ihrer Login-Webseite/Controller, die Sie für die Existenz eines ReturnUrl Parameters in der Request.QueryStrings Sammlung überprüfen würden. Wenn es existiert, können Sie eine Umleitung zurück zur Anmeldeseite durchführen, aber ohne die ReturnUrl. Eine andere Option wäre, eine benutzerdefinierte Implementierung für die FormsAuthenticationModule zu erstellen. Dies ist die Klasse, die die Authentifizierung eines Benutzers basierend auf ihrem Formularauthentifizierungsticket durchführt und für die Umleitung nicht autorisierter Benutzer auf die Anmeldeseite verantwortlich ist. Leider sind die Methoden der Klasse FormsAuthenticationModule nicht virtuell, daher können Sie keine abgeleitete Klasse erstellen und die benötigten Methoden außer Kraft setzen, aber die gute Nachricht ist, dass die Klasse ziemlich einfach ist - vielleicht 100-200 Zeilen Code insgesamt Reflektor Sie könnten schnell Ihre eigene benutzerdefinierte FormsAuthenticationModule Klasse erstellen. Wenn Sie diese Route (die ich nicht empfehlen würde), alles, was Sie tun müssten, wäre, um den Code in der OnLeave Methode, die auf dem ReturnUrl-Parameter geht. (Zusätzlich zum Ändern dieser Klasse müssen Sie auch die Datei Web.config so konfigurieren, dass Ihre Anwendung die benutzerdefinierte Klasse FormsAuthenticationModule und nicht die in .NET Framework verwendet.)

Happy Programming!

10

eine benutzerdefinierte Autorisieren

erstellen Attribut
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); 
     } 
    } 
} 

verwenden Sie es dann auf dem Controller

[CustomAuthorizeAttribute] 
public ActionResult Login() 
{ 


    return View(); 
} 
+2

Ich bevorzuge diese Lösung, obwohl ich glaube, dass es mehr Sinn macht, den Code in 'HandleUnauthorizedRequest' zu haben und diese Zeile statt' filterContext.Result = new RedirectResult (FormsAuthentication.LoginUrl); ' –

2

einen Standort-Tag zu Ihrer web.config hinzufügen. Wenn sich Ihre Seite in einem Unterverzeichnis befindet, fügen Sie das web.config dem Unterverzeichnis hinzu.

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

ASP wird übersehen Hinzufügen der ReturnUrl Abfragezeichenfolgeflag und anmelden zu lenken.

+0

wow, ich hatte dieses Problem hier http suchen : //stackoverflow.com/questions/19301787/asp-net-links-wont-redirect-to-the-right-page Dank es half mir, und wir hatten den gleichen Seitenname :) – meda

12

Fügen Sie dies Ihrer Global.asax-Datei hinzu.

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/form-authentication-and-url-rewriting Ich benutze benutzerdefinierte Formulare Authentifizierung. Wenn ich den Code benutze, den Sie den Regelkreisen immer wieder gegeben haben, heißt es - 'Zu viele Redirects'. Ich denke, das Problem ist, wenn das Control auf 'Login' Seite wie' mywebsite.com/Login' geht, dann prüft es auf Authentifizierung und es wird auf 'Login.aspx' Seite umgeleitet. und Ihr Code wird erneut auf die Seite "Login" umgeleitet. Diese Schleife wird fortgesetzt. Kannst du mir dabei helfen ??? –

+0

Brauchen wir nicht ein ': base()' im MvcApplication-Konstruktor? – Roberto

1

, wenn Sie asp.net Kontrolle Loginstatus verwenden, dann auf Login-Status Steuer drücken f4 klicken (Objekte) unter Verhalten Abschnitt können wir LogoutAction sehen dort Return wählen Seite einzuloggen.

Hinweis: Um es erfolgreich umzusetzen, müssen Sie eine Login-Seite mit dem Namen login.aspx

+0

es heißt "Redirect Login-Seite" (und in Markup ist es LogoutAction = "RedirectToLoginPage") –

8

Einfache ...

[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

In meinem Fall musste ich den Pfad in startup.auth.cs und nicht in Web-Konfiguration ändern: 'app.UseCookieAuthentication (neu CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new pathstring (("/ Account/LoginRedirect")), ... ' ich auch RedirectToActionPermanent statt RedirectToAction verwendet, weil es pernament ist –

+0

Dies ist eine gute Lösung. - Der einzige Nachteil ist, dass Sie in Ihrem Browser-Verlauf die Anfrage an LoginRedirect haben. Wenn also jemand die Zurück-Taste einmal drückt, bringt er sie zurück zu LoginRedirect und dann wieder zurück zur Anmeldung. – Jim

-1
protected void LoginControl_LoggedIn(object sender, EventArgs e) 
{ 
    Response.Redirect("~/selection.aspx"); 
} 
haben
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

Sie können das Element HttpUtility.ParseQueryString verwenden, um dieses Element zu entfernen. Wenn Sie VB.NET verwenden dann tut dieser Code dieses

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 

würde ich dies in der Page.Init Veranstaltung gestellt - natürlich müssen Sie die „/Default.aspx“ ändern Sie die URL Ihrer Login-Seite passen .

1

Wenn Sie returnURL aus Anfrage entfernen und in einen bestimmten Pfad umleiten möchten, können Sie diese Schritte ausführen.

Zuerst den aktuellen Kontext abrufen, überprüfen, ob der Benutzer authentifiziert ist und schließlich den aktuellen Pfad umleiten.

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"); 
      } 

     } 

Ich habe diesen Code in Page_Load-Methode aus meiner Klasse Login.aspx.cs