2009-09-14 5 views
10

J'ai un contrôleur avec un attribut Autorisez comme ceci:Comment afficher une page d'erreur personnalisée pour un résultat Http 401?

[Authorize(Roles = "Viewer")] 
public class HomeController : Controller 
{ 
    //... 
} 

et mon web.config a customErrors fixé comme suit:

<customErrors mode="On"> 
     <error statusCode="401" redirect="notauthorized.html"/> 
    </customErrors> 

Lorsque je tente d'invoquer une action sur le contrôleur Home en utilisant un rôle non autorisé, je reçois juste une page blanche. Je ne suis pas redirigé vers la page personnalisée. Des idées?

Répondre

0

Une approche standard pour autant que je sache, est d'avoir un contrôleur simple d'erreur qui gère les requêtes entrantes et fournit la vue appropriée selon le code de httpStatus a été retourné ... quelque chose comme ceci:

public class ErrorController : Controller 
{ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult Index() 
    { 

     //Check if the statuscode is HttpStatusCode.NotFound; 
     if(Response.StatusCode == 401) 
      return View("NotAuthorised"); 
     return View(); 
    } 
} 

et puis spécifiez une action de redirection dans votre webconfig:

<customErrors mode="On" defaultRedirect="~/Error" /> 
3

Jetez un oeil à tvanfosson « s Answer de this very similar question, c'est ce que je fais (Merci à tvanfosson), maintenant je viens de dire:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")] 
public class SuperAdminController : Controller 
... 

Si l'utilisateur n'est pas dans le rôle, il obtiendra la vue thew spécifiée par ViewName.

Note: la page blanche vient de Cassini, si vous déplacez l'application vers un serveur IIS réel que vous verrez le 401.

+0

vous dire si je propose l'application pour IIS je devrais voir page personnalisée? ou je devrais juste voir la page IIS 401 standard? –

+0

Vous verrez le 401. –

9

J'apprécie cette question est un peu vieux, mais cela peut aider quelqu'un .

Pour un 401, vous verrez probablement la page 401 non autorisée, même si vous avez ajouté 401 à la section customerrors de votre fichier web.config. J'ai lu que lors de l'utilisation de IIS et l'authentification Windows la vérification se produit avant ASP.NET voit même la demande, d'où vous voyez la page vide sur Cassini et sur IIS elle-même 401.

Pour mon projet j'ai édité le fichier Global.asax pour rediriger vers un itinéraire que j'avais créé pour les erreurs 401, en envoyant l'utilisateur à la vue "Unauthorized to see this".

Dans le Global.asax:

void Application_EndRequest(object sender, System.EventArgs e) 
    { 
     // If the user is not authorised to see this page or access this function, send them to the error page. 
     if (Response.StatusCode == 401) 
     { 
      Response.ClearContent(); 
      Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults); 
     } 
    } 

et dans le Route.config:

 routes.MapRoute(
     "ErrorHandler", 
     "Error/{action}/{errMsg}", 
     new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional } 
     ); 

et dans le contrôleur:

public ViewResult Unauthorised() 
    { 
     //Response.StatusCode = 401; // Do not set this or else you get a redirect loop 
     return View(); 
    } 
0

vous pouvez également créer votre propre attribut d'autorisation personnalisé et définissez votre propre itinéraire pour rediriger les utilisateurs sur y notre page

Voici un échantillon sur mon projet:

/*../controllers/CustomAuthorizationAttribute.cs */ 
public class CustomAuthorizationAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext) 
    { 
     string session = filterContext.HttpContext.Session["id"] != null ? filterContext.HttpContext.Session["id"].ToString() : null; 
     if (string.IsNullOrEmpty(session)) 
     { 
      // Unauthorized! 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
       { 
        { "action", "Create" }, { "controller", "Sessions" } 
        //,{ "parameterName", "YourParameterValue" } 
       } 
      ); 
     } 
    } 
} 

et vous ajoutez votre « drapeau » dans votre contrôleur d'action comme celui-ci

/*../controllers/ReportsController.cs */ 
public class ReportsController : Controller 
{ 
    [CustomAuthorizationAttribute] 
    public ActionResult Index() 
    { 
     //do something 
    } 
} 
Questions connexes