web-dev-qa-db-fra.com

ASP.NET MVC 4 Attribut d'autorisation personnalisé - Comment rediriger les utilisateurs non autorisés vers la page d'erreur?

J'utilise un attribut d'autorisation personnalisé pour autoriser l'accès des utilisateurs en fonction de leurs niveaux d'autorisation. J'ai besoin de rediriger les utilisateurs non autorisés (par exemple, l'utilisateur essaie de supprimer une facture sans supprimer le niveau d'accès) pour accéder à la page refusée.

L'attribut personnalisé fonctionne. Mais dans le cas d'un accès utilisateur non autorisé, rien ne s'affiche dans le navigateur.

Code du contrôleur.

public class InvoiceController : Controller
{
    [AuthorizeUser(AccessLevel = "Create")]
    public ActionResult CreateNewInvoice()
    {
        //...

        return View();
    }

    [AuthorizeUser(AccessLevel = "Delete")]
    public ActionResult DeleteInvoice(...)
    {
        //...

        return View();
    }

    // more codes/ methods etc.
}

Code de classe d'attribut personnalisé.

public class AuthorizeUserAttribute : AuthorizeAttribute
{
    // Custom property
    public string AccessLevel { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {                
            return false;
        }

        string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // Call another method to get rights of the user from DB

        if (privilegeLevels.Contains(this.AccessLevel))
        {
            return true;
        }
        else
        {
            return false;
        }            
    }
}

Appréciez si vous pouvez partager votre expérience à ce sujet.

22
chatura

Vous devez remplacer le HandleUnauthorizedRequest comme spécifié ici .

public class CustomAuthorize: AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(new
            RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" }));
        }
    }
}

** Remarque: déclaration conditionnelle mise à jour en janvier 2016

67
VJAI