ASP.NET MVC 5 Page d'Erreur Personnalisée
Je suis en utilisant une mesure d'autoriser l'attribut dans un ASP.NET MVC 5 application comme suit:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
if (context.HttpContext.Request.IsAuthenticated)
{
context.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(context);
}
}
}
Dans system.web
section de mon site web.config je l'ai mentionné erreur de parcours:
<system.web>
<customErrors mode="On" defaultRedirect="/Error/Error">
<error statusCode="403" redirect="/Error/NoPermissions"/>
</customErrors>
</system.web>
Mais jamais je ne suis redirigé vers ma page d'erreur personnalisée à /Error/NoPermissions
. Au lieu de cela, le navigateur afficher le général page d'erreur disant "Erreur HTTP 403.0 - Interdit".
- Vous avez le contrôleur nommé d'Erreur avec l'Action NoPermissions à l'intérieur?
- Oui, certainement.
- Modifier la config pour <customerrors defaultredirect="Erreur" mode="Sur"> <erreur de redirection="NoPermissions" statuscode="403"> </erreur></customerrors>
- Il n'a pas de travail. Bien dans une application MVC 4, j'ai eu des configurations comme <customErrors mode="Sur" defaultRedirect="/Erreur/Erreur"> <erreur statusCode="403" redirect="/Erreur/UnauthorizedError" /> </customErrors>, et il a très bien fonctionné.
- Eh bien, il n'y a pas beaucoup de différence entre la MVC 4 et MVC5 parler d'erreurs personnalisées. Il y a autre chose de mal là. Peut-être que votre contrôleur. Assurez-vous de ne pas avoir l'autorisation de l'attribut.
- mon Erreur Contrôleur/Actions n'ont pas d'attributs sur eux.
Vous devez vous connecter pour publier un commentaire.
[1]: Supprimer tous les 'customErrors" & "httpErrors' à partir du Web.config
[2]: Cochez La Case 'App_Start/FilterConfig.cs' ressemble à ceci:
[3]: à l'échelle Mondiale.asax " ajouter cette méthode:
[4]: Ajouter Des " Contrôleurs/ErrorPageController.cs'
[5]: en 'Views/Shared/Erreur.cshtml'
😀
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
causes d'exception sur MVC 5 .NET 4.7.1Merci tout le monde, mais le problème n'est pas avec 403 du code. En fait le problème était avec la façon dont j'ai essayé de retour 403. Je viens de modifier mon code pour jeter un
HttpException
au lieu de retourner leHttpStatusCodeResult
et tout fonctionne maintenant. Je peux retourner tout le code d'état HTTP en jetantHttpException
exception et mescustomErrors
configuration de prises toutes. Peut-êtreHttpStatusCodeResult
n'est pas de faire le travail exact je m'attendais à faire.Je viens de remplacer
avec
Que c'est.
Heureux de codage.
J'ai aussi eu ce problème. Code dans le cas des OP question est parfaitement fonctionne sauf le code d'erreur personnalisée dans
<system.web>
dans la sectionweb.config
fichier. Pour résoudre le problème ce que je dois faire est d'ajouter le code suivant à<system.webServer>
. Notez que‘webserver’
au lieu de‘web’
.Si quelqu'un est en suivant le plan de l'environnement, voici la solution complète:
L'Environnement:
Classe Attribut personnalisé:
Ajouter la classe suivante à votre site web de l'espace de noms par défaut. La raison est expliquée ici, dans la accepté de répondre à Un Débordement de pile question: Pourquoi ne AuthorizeAttribute rediriger vers la page de connexion pour l'authentification et l'autorisation des échecs?
Puis ajoutez le code suivant à la
web.config
fichierArticle suivant expliquer plus à ce sujet: ASP.NET MVC: l'Amélioration de l'Autoriser Attribut (403 Forbidden)
Et httpErrors dans le web.config dans cet article: Démystifier ASP.NET MVC 5 Pages d'Erreur et de Journalisation des Erreurs
Puis ajouter le ErrorController.cs pour les Contrôleurs de dossier
Puis ajouter un non autorisée.cshtml pour Afficher/dossier Partagé
Cela permettra de montrer personnalisé page d'erreur au lieu de navigateur généré page d'erreur.
Aussi noter que pour l'environnement ci-dessus, il n'est pas nécessaire de commenter le code à l'intérieur
RegisterGlobalFilters
méthode ajouté par le modèle, comme le suggère l'une des réponses.Veuillez noter que je viens de couper et de coller le code de mon projet de travail, j'ai donc utilisé
Unauthorized
à la place des OPNoPermissions
dans le code ci-dessus.depuis j'ai couru dans un problème similaire, j'ai voulu jeter plus de lumière sur elle.
customErrors ne capture réelle http exceptions levées dans votre ASP.NET application. Le HttpStatusCodeResult ne jette pas une exception, bien que. Il écrit seulement une réponse avec la fonction code d'état, qui fait plus de sens dans votre exemple.
Si vous êtes en cours d'exécution sur IIS 7.0 ou supérieur, vous devriez être en utilisant httpErrors maintenant, que cela va vous montrer des pages d'erreur personnalisées dans tous les cas. C'est un IIS mise à niveau.
J'ai écrit un billet de blog à ce sujet pour expliquer les différences:
http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging
Mise à jour
Vous avez seulement besoin de faire de spécial pour rediriger erreurs 403. Toutes les autres erreurs 500 devrait prendre effet, par le biais de votre
defaultRedirect="/Error/Error"
paramètre danscustomErrors
. Toutefois, vous devez supprimer ou commenter la HandleErrorAttribute inscription dans le App_Start/FilterConfig.cs fichier pour les erreurs personnalisées fonctionnent réellement. Sinon, cet attribut devra rediriger toutes les erreurs à l'Erreur.cshtml fichier dans la Vue/répertoire Partagé.Réponse Originale À Cette Question
Autant que je sache, vous ne pouvez pas utiliser customErrors dans le web.config pour gérer les erreurs 403 pour une raison quelconque. Je ressens votre douleur comme il semble comme quelque chose qui devrait être aussi simple que le code que vous avez déjà, mais apparemment erreurs 403, sont traités comme un serveur web de préoccupation.
Ce que vous pouvez faire à la place est juste rediriger l'utilisateur de votre choix "NoPermissions" page comme ceci:
La demande aura un code d'état 200 au lieu de 403, mais si vous pouvez vivre avec ça, c'est une simple solution de contournement.
Voici une semblable question pour plus d'info: De retour d'erreurs personnalisées.
En outre, cet article explique comment aller de l'IIS de l'itinéraire: http://kitsula.com/Article/MVC-Custom-Error-Pages