8
votes

C # MVC: Comment remplacer la redirection de l'authentification configurée?

J'ai une application mvc avec le bloc suivant à l'intérieur dans web.config: xxx

Donc, si un utilisateur demande une page et une autorisation échoue, ils seront redirigés vers ~ / Login.

C'est bien et j'en ai besoin pour la plupart de mes contrôleurs. Cependant, j'ai un contrôleur que j'aimerais contourner cette règle. Comment puis-je autoriser des contrôleurs spécifiques à ignorer cette règle?

Mon problème est que dans mon application MVC (qui comporte plusieurs contrôleurs), j'ai un certain contrôleur qui héberge une interface de repos (non destinée à l'utilisation du navigateur). Étant donné que ce contrôleur n'est pas destiné à la consommation de navigateur, je ne veux pas que cela renvoie une page de connexion complète, (ou quelle que soit la page, juste des cordes ou des vues partielles.)

Notez que je ' m Utilisation des attributs personnalisés [Autoriser ...] sur mes actions, et lorsque ceux-ci échouent, ils redirigent vers une action d'erreur - mais, malheureusement, mon action d'erreur (qui renvoie une chaîne courte) est redirigée vers la connexion Page En raison de ce paramètre de configuration!

Je suis étourdi à essayer de comprendre cela, qu'est-ce que je fais mal? Je peux fournir plus de détails si nécessaire.


2 commentaires

Héritez-vous d'autoriserizeattribute ou de mise en œuvre de iAuthorizationFilter


Héritage de l'autoraeattribute.


3 Réponses :


2
votes

Ajoutez les éléments suivants après votre système System.Web dans web.config: xxx

Ceci permettra aux utilisateurs non authentifiés, accès à "/ home" et donc à toutes les actions sur le homécontrôleur.


1 commentaires

Je n'aime pas l'idée de mettre cela dans web.config, car c'est quelque chose que je ne veux pas pouvoir oublier accidentellement de déployer ou d'écraser accidentellement. Mais cela pourrait être une bonne approche dans d'autres situations, merci.



11
votes

Vous pouvez étendre la classe AuthorizeAreTtribute et remplacer le guéronauthorizeRequest, vous voudrez peut-être renvoyer un code d'état HTTP interdit plutôt qu'un message personnalisé.

public class CustomAuthorizationAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // You need to set this action result to something other than a HttpUnauthorizedResult, 
        // this result will cause the redirection to the login page

        // Forbidden request... does not redirect to login page
        // filterContext.Result = new HttpStatusCodeResult(403);

        filterContext.Result = new ErrorActionResult { ErrorMessage = "Unauthorized Access" };
    }
}

public class ErrorActionResult : ActionResult
{
    public string ErrorMessage { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Write(this.ErrorMessage);
    }
}


1 commentaires

Vous avez défini mon problème tête sur: le retour d'un 401 non autorisé lui faisait rediriger. L'utilisation interdite semble être une bonne solution de contournement, bien que d'être honnête, je préférerais un utilisateur «non autorisé» que «interdit» dans ce cas. Mais je vais simplement utiliser interdit.



0
votes

0 commentaires