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?
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.
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 );
}
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();
}
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>
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!
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.
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
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.
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");
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.