web-dev-qa-db-fra.com

Comment supprimer returnurl de l'URL?

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 effectuer certaines sélections.

Comment puis je faire ça?

35
Ali Ersöz

C’est la nature de Authentification par formulaires . (qui je suppose que vous utilisez).

En d'autres termes, lorsque vous accédez à une page nécessitant une authentification, ASP.NET vous redirigera vers la page de connexion, en passant le paramètre ReturnUrl en tant que paramètre afin que vous puissiez revenir à la page issue de votre post-connexion.

Supprimer cette fonctionnalité casserait 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 .

J'essaie de rediriger l'utilisateur vers un page statique après la connexion pour faire un peu sélections.

Un morceau de gâteau - après que vous ayez fait votre connexion, au lieu de faire FormsAuthentication.RedirectFromLoginPage (qui utilise ce même paramètre ReturnUrl QueryString), utilisez simplement FormsAuthentication.SetAuthCookie et redirigez-le où vous le souhaitez.

23
RPM1984

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

  }
14
William Humphreys

Créer un attribut d'autorisation personnalisé

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

puis utilisez-le sur votre contrôleur

[CustomAuthorizeAttribute]
public ActionResult Login()
{


    return View();
}
11
Aivan Monceller

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>
9
Carlos Candeias

Comme RPM1984 l’a souligné, il n’est pas nécessaire de rediriger l’utilisateur vers l’URL spécifiée après la connexion.

S'il est impératif de supprimer le paramètre ReturnUrl querystring, plusieurs options s'offrent à vous. Le plus simple est probablement dans votre page Web/contrôleur de connexion que vous vérifiiez l'existence d'un paramètre ReturnUrl dans la collection Request.QueryStrings. S'il existe, vous pouvez rediriger la page de connexion, mais sans la variable ReturnUrl.

Une autre option serait de créer une implémentation personnalisée pour la variable FormsAuthenticationModule, qui est la classe qui gère l'authentification d'un utilisateur en fonction de son ticket d'authentification de formulaire et 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. Vous ne pouvez donc pas créer de classe dérivée et redéfinir les méthodes nécessaires, mais la bonne nouvelle est que la classe est assez simple: peut-être 100-200 lignes de code au total, et Réflecteur, vous pouvez créer rapidement votre propre classe FormsAuthenticationModule personnalisée. Si vous choisissez cette voie (ce que je ne recommanderais pas), tout ce que vous auriez à faire serait d'extraire 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 de sorte que votre application utilise votre classe FormsAuthenticationModule personnalisée plutôt que celle du .NET Framework.)

Bonne programmation!

8
Scott Mitchell

Ajoutez une balise 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 ignorera l'ajout de la chaîne de requête ReturnUrl et la commande de connexion.

2
Fio

Si vous souhaitez supprimer returnURL de request et rediriger vers un chemin spécifique, procédez comme suit.

D'abord, obtenez le contexte actuel, vérifiez si l'utilisateur est authentifié et, enfin, redirigez 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");
            }

        }

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

2
Alberto Delgadillo

si vous utilisez asp.net control loginstatus, cliquez sur le contrôle de statut de connexion, appuyez sur f4 (pour les propriétés) dans la section comportement, vous pouvez voir LogOutAction à cet emplacement, puis sélectionnez Retour à la page de connexion.

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

1
Rohith
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
Otto

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

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 ceci dans l'événement Page.Init - vous devrez évidemment changer le "/default.aspx" pour correspondre à l'URL de votre page de connexion.

0
Adam