Question

Un peu de contexte: Notre client souhaitait un certain nombre d'actions pour revenir à l'action précédente lorsque vous avez terminé.Par exemple, si il était sur une liste d'objets et qu'il a cliqué sur "créer un nouvel objet" bouton, il voulait retourner à la liste après qu'il remplit et enregistre le formulaire ou après qu'il annule l'action.Nous avons mis en place il en imitant la ReturnUrl comportement qui est utilisé avec des tentatives d'accès non autorisées (ajout de l'adresse actuelle comme une url encodée paramètre de requête).

Le problème: Si je ne suis pas autorisé (ou en d'autres mots pas connecté) et essayez d'accéder à une action qui le nécessite-je obtenir redirigé vers la page de login (que je devrais le faire) et le courant de l'url est mis dans ReturnUrl param.Toutefois, lorsque l'adresse actuelle contient déjà ReturnUrl requête param, je ne suis pas redirigé partout et à la place j'ai une page blanche.Est-il une raison pourquoi cela se produit?

Le résultat attendu serait redirigé vers l'écran de connexion avec l'adresse url de la version encodée de) url à mettre dans le ReturnUrl param (peu importe si l'url contient ses propres ReturnUrl param ou pas)

Est-il un moyen de le faire fonctionner comme prévu?Assurez-vous dans la théorie, je pourrais renommer le "ReturnUrl" param (dans mes propres actes) pour quelque chose d'autre, mais nous avons utilisé un tel paramètre dans de nombreux endroits déjà que les renommant ne va pas être une tâche facile.D'ailleurs, je ne comprends vraiment pas pourquoi cela ne fonctionne pas en premier lieu.

P. S.Le problème se produit uniquement si j'ai le nom du paramètre ReturnUrl, si c'est returnUrl tout fonctionne comme il se doit.


Edit:Cette question a été précédemment appelé:Non autorisée, l'accès restreint à des actions ne retourne rien si l'url contient le paramètre ReturnUrl.J'ai changé le titre pour le rendre plus facile à comprendre.


Edit:Cette question est peut-être un doublon de Non autorisée de la demande ne redirige pas vers la page de login avec returnUrl paramètre de chaîne de requête.Je vais avoir à investiguer davantage si la solution fournie il résout mon problème ou pas. Mise à jour:Le libellé est similaire, mais le problème est différent, après tout, il n'est donc pas un doublon.

Était-ce utile?

La solution

Ce prouvé une douleur importante à corriger, mais j'ai réussi à le faire.Dans la quête pour trouver pourquoi la redirection de connexion échoue pour certaines url, j'ai eu moi aussi répondre à une question importante.Ce qui est réellement responsable de la redirection et comment puis-je remplacer?

Cette l'article qui m'a mis sur la piste (la chose responsable de la redirection a été l' [Authorize] le filtre) et j'ai commencé à chercher une solution.Après un peu de recherche j'ai trouvé cette personnalisé simple Autorisation de filtre.Bien sûr, il n'a pas fait ce que je veux sortir de la boîte (et ce que je veux, c'est essentiellement pour les autoriser à travailler comme d'habitude mais pas de pause sur les url qui contiennent des ReturnUrl param), j'ai donc modifié le code et obtenu ceci:

public class Authorize2 : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // 1. Get the default login url that was declared in web.config
        string returnUrl = FormsAuthentication.LoginUrl;
        // 2. Append current url as a return url to the login url
        returnUrl += "?ReturnUrl=" + HttpUtility.UrlEncode(HttpContext.Current.Request.Url.PathAndQuery);
        // 3. ...
        // 4. Profit
        filterContext.Result = new RedirectResult(returnUrl);
    }
}

Après avoir écrit ce bout de code, j'ai passé une heure à essayer de comprendre pourquoi ça ne fonctionne pas (les points d'arrêt à l'intérieur de HandleUnauthorizedRequest n'ont jamais touché).Ensuite, j'ai trouvé cette le site et il prenait tout son sens.Un de mes collègues a ajouté un mondial Authorize filtre à toutes les actions pour quelque raison que ce soit et mon propre filtre personnalisé n'a jamais été demandé d'autoriser quoi que ce soit (\App_Start\FilterConfig.cs).Après la suppression de cette ligne (je vais devoir mettre mon filtre personnalisé à sa place par la suite), le code ci-dessus fonctionne comme un charme.

Dans un sens, la question est toujours ouverte, je veux dire que c'est encore un mystère pourquoi Autoriser échoue pour ces url.La réponse à cette question réside sans doute dans System.Web.Mvc.AuthorizeAttribute le code source, mais pour l'instant je suis contente de l'avoir fonctionner correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top