2010-09-15 6 views
31

Je souhaite supprimer "returnurl =/blabla" de la barre d'adresse lorsqu'un utilisateur souhaite accéder à une page de connexion requise. Parce que j'essaie de rediriger l'utilisateur vers une page statique après la connexion pour faire quelques sélections.Comment supprimer une erreur url?

Comment puis-je faire cela?

Répondre

20

Ceci est la nature de Authentification de formulaires. (qui je devine que vous utilisez). En d'autres termes, lorsque vous accédez à une page nécessitant une authentification, ASP.NET vous redirige vers la page de connexion, en lui transmettant le paramètre ReturnUrl en tant que paramètre. Vous pouvez ainsi revenir à la page issue de la connexion.

Supprimer cette fonctionnalité briserait la sémantique et la conception de l'authentification par formulaires elle-même. (IMO)

Ma suggestion - si vous n'en avez pas besoin, ne l'utilisez pas.

Je suis en train de rediriger l'utilisateur vers une page statique après la connexion pour faire quelques sélections.

morceau de gâteau - une fois que vous avez fait votre login, au lieu de faire FormsAuthentication.RedirectFromLoginPage (qui utilise ce paramètre QueryString très ReturnUrl), il suffit d'utiliser FormsAuthentication.SetAuthCookie et redirect où vous voulez.

+0

FormsAuthentication.SetAuthCookie est ce que je fais now.I veux juste retirer de la barre d'adresse. –

+0

Ensuite, mon premier commentaire est valable - vous pouvez également ne pas utiliser d'authentification par formulaire. Il n'y a pas de moyen facile de le faire (que je sache). Une page REMebering ANY peut rediriger vers la page de connexion (et ASP.NET le fait). La seule façon dont je peux penser est de se connecter à un événement Global.asax et de réécrire l'URL. Pourquoi vous souciez-vous si l'URL est là? – RPM1984

+0

et ce commentaire contredit votre commentaire "Parce que j'essaie de rediriger l'utilisateur vers une page statique après la connexion pour faire quelques sélections.". Le ReturnURL ne vous empêchera pas de faire votre propre redirection après la connexion, SAUF si vous utilisez RedirectFromLoginPage, que vous avez dit que vous n'êtes pas. Donc, je ne sais pas quel est votre problème. Comment ReturnUrl vous empêche-t-il de faire une redirection? – RPM1984

8

Comme RPM1984 a souligné, vous ne devez pas rediriger l'utilisateur vers l'URL spécifiée après la signature dans.

S'il est impératif que vous supprimez le paramètre ReturnUrl querystring il y a deux options. Probablement le plus facile est dans votre page de connexion/contrôleur que vous vérifieriez l'existence d'un paramètre ReturnUrl dans la collection Request.QueryStrings. S'il existe, vous pouvez rediriger vers la page de connexion, mais sans le ReturnUrl. Une autre option consiste à créer une implémentation personnalisée pour le FormsAuthenticationModule, qui est la classe qui gère l'authentification d'un utilisateur en fonction de son ticket d'authentification de formulaire et qui est responsable de la redirection des utilisateurs non autorisés vers la page de connexion. Malheureusement, les méthodes de la classe FormsAuthenticationModule ne sont pas virtuelles, donc vous ne pouvez pas créer une classe dérivée et remplacer les méthodes nécessaires, mais la bonne nouvelle est que la classe est assez simple - juste 100-200 lignes de code au total, et en utilisant Réflecteur, vous pouvez créer rapidement votre propre classe personnalisée FormsAuthenticationModule. Si vous suivez cette route (que je ne recommanderais pas), tout ce que vous devez faire serait de sortir le code de la méthode OnLeave qui pointe sur le paramètre ReturnUrl. (En plus de modifier cette classe, vous devez également configurer votre fichier Web.config afin que votre application utilise votre classe FormsAuthenticationModule personnalisée plutôt que celle du .NET Framework.)

Bonne programmation!

10

Créer une coutume Autorisez 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); 
     } 
    } 
} 

, utilisez-le sur votre contrôleur

[CustomAuthorizeAttribute] 
public ActionResult Login() 
{ 


    return View(); 
} 
+2

Je préfère cette solution, bien que je pense qu'il est plus logique d'avoir le code dans 'HandleUnauthorizedRequest' et d'utiliser cette ligne à la place' filterContext.Result = new RedirectResult (FormsAuthentication.LoginUrl); ' –

2

Ajouter un tag d'emplacement à votre web.config. Si votre page se trouve dans un sous-répertoire, ajoutez le web.config au sous-répertoire.

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

ASP surplombera ajouter le ReturnUrl querystring et la direction pour se connecter.

+0

wow, j'ai eu ce problème regardez ici http : //stackoverflow.com/questions/19301787/asp-net-links-wont-redirect-to-the-right-page Merci, ça m'a aidé, et nous avions le même nom de page :) – meda

12

Ajoutez ceci à votre fichier 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/form-authentication-and-url-rewriting J'utilise l'authentification par formulaires personnalisés. Si j'utilise le code que vous avez donné aux boucles de contrôle encore et encore et qu'il dit - 'Too many Redirects'. Je pense que le problème est, lorsque le contrôle va à la page 'Login' comme' mywebsite.com/Login', alors il vérifie l'authentification et redirige vers la page 'Login.aspx'. et votre code redirige à nouveau vers la page 'Login'. Cette boucle continue. Peux-tu m'aider avec ceci ??? –

+0

N'avons-nous pas besoin d'un ': base()' dans le constructeur MvcApplication? – Roberto

1

si vous utilisez LoginStatus de contrôle asp.net puis cliquez sur le contrôle état de connexion appuyez sur f4 (pour les propriétés) conformément à l'article comportement, nous pouvons voir LogoutAction y sélectionner Retour à la page de connexion.

Note: Pour la mettre en œuvre avec succès, vous devez avoir une page de connexion avec le nom login.aspx

+0

il est appelé "rediriger vers la page de connexion" (et dans le balisage il est LogoutAction = "RedirectToLoginPage") –

8

simple ...

[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

Dans mon cas, j'ai dû changer le chemin dans startup.auth.cs et non dans la configuration web: 'app.UseCookieAuthentication (new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString (("/ compte/loginRedirect")), ... ' J'ai aussi utilisé RedirectToActionPermanent au lieu de RedirectToAction parce qu'il est pernament –

+0

Ceci est une bonne solution. - le seul inconvénient est que vous auriez la demande à LoginRedirect dans l'historique de votre navigateur, donc si quelqu'un touche le bouton Précédent une fois, cela le ramènera à LoginRedirect et ensuite à Login. – 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

Vous pouvez utiliser HttpUtility.ParseQueryString pour supprimer cet élément. Si vous utilisez ce code VB.NET alors le fait

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 

je mettrais cela dans l'événement Page.Init - vous aurez évidemment besoin de changer la « /default.aspx » pour correspondre à l'URL de votre page de connexion .

1

Si vous souhaitez supprimer returnURL de la requête et rediriger vers un chemin spécifique, vous pouvez suivre cette procédure.

Tout d'abord obtenir le contexte actuel, vérifier si l'utilisateur est authentifié et enfin rediriger le chemin actuel.

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

     } 

Je mis ce code dans la méthode Page_Load de ma classe Login.aspx.cs

Questions connexes