127 votes

ASP.NET MVC 4 Personnalisé Autoriser Attribut avec la Permission des Codes (sans rôles)

J'ai besoin de contrôler l'accès à des vues basées sur les utilisateurs les niveaux de privilège (il n'y a pas des rôles que les niveaux de privilège pour l'opération CRUD niveaux affectés à des utilisateurs) dans mon MVC 4 application.

Exemple comme ci-dessous AuthorizeUser sera mon attribut personnalisé abd j'ai besoin de l'utiliser comme ci-dessous.

[AuthorizeUser(AccessLevels="Read Invoice, Update Invoice")]
public ActionResult UpdateInvoice(int invoiceId)
{
   // some code...
   return View();
}


[AuthorizeUser(AccessLevels="Create Invoice")]
public ActionResult CreateNewInvoice()
{
  // some code...
  return View();
}


[AuthorizeUser(AccessLevels="Delete Invoice")]
public ActionResult DeleteInvoice(int invoiceId)
{
  // some code...
  return View();
}

Est-ce possible de le faire? Comment? Merci à l'avance...

Chatura

253voto

chatura Points 929

Je pourrais le faire avec un attribut personnalisé comme suit.

    [AuthorizeUser(AccessLevel = "Create")]
    public ActionResult CreateNewInvoice()
    {
        //...

        return View();
    }

Classe Attribut personnalisé comme suit.

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;
        }            
    }
}

Vous pouvez rediriger un utilisateur non autorisé dans votre personnalisé AuthorisationAttribute en substituant l' HandleUnauthorizedRequest méthode:

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary(
                        new
                            { 
                                controller = "Error", 
                                action = "Unauthorised" 
                            })
                    );
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X