it-swarm.com.de

Benutzerdefiniertes Berechtigungsattribut von ASP.NET MVC 4 mit Berechtigungscodes (ohne Rollen)

Ich muss den Zugriff auf Ansichten basierend auf den Berechtigungsstufen der Benutzer (es gibt keine Rollen, nur Berechtigungsstufen für CRUD-Betriebsebenen, die Benutzern zugewiesen sind) in meiner MVC 4-Anwendung steuern. 

Beispiel wie unter AuthorizeUser wird mein benutzerdefiniertes Attribut sein und ich muss es wie folgt verwenden.

[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();
}

Ist das möglich? Wie? Danke im Voraus...

Chatura

111
chatura

Ich könnte dies mit einem benutzerdefinierten Attribut wie folgt durchführen.

[AuthorizeUser(AccessLevel = "Create")]
public ActionResult CreateNewInvoice()
{
    //...
    return View();
}

Benutzerdefinierte Attributklasse wie folgt.

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

        return privilegeLevels.Contains(this.AccessLevel);           
    }
}

Sie können einen nicht autorisierten Benutzer in Ihrer benutzerdefinierten AuthorisationAttribute umleiten, indem Sie die HandleUnauthorizedRequest-Methode überschreiben:

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

Hier ist eine Modifikation für den vorigen. Antworten. Der Hauptunterschied besteht darin, dass der Benutzer, wenn er nicht authentifiziert ist, die ursprüngliche Methode "HandleUnauthorizedRequest" verwendet, um zur Anmeldeseite umzuleiten:

   protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {

        if (filterContext.HttpContext.User.Identity.IsAuthenticated) {

            filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary(
                            new
                            {
                                controller = "Account",
                                action = "Unauthorised"
                            })
                        );
        }
        else
        {
             base.HandleUnauthorizedRequest(filterContext);
        }
    }
10
Leonid Minkov

Vielleicht ist dies für alle in der Zukunft nützlich. Ich habe ein benutzerdefiniertes Attribut zum Autorisieren wie folgt implementiert:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class ClaimAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _claim;

    public ClaimAuthorizeAttribute(string Claim)
    {
        _claim = Claim;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;
        if(user.Identity.IsAuthenticated && user.HasClaim(ClaimTypes.Name, _claim))
        {
            return;
        }

        context.Result = new ForbidResult();
    }
}
1
RaphaelH

Wenn Sie die WEB-API mit Ansprüchen verwenden, können Sie dies verwenden:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
public class AutorizeCompanyAttribute:  AuthorizationFilterAttribute
{
    public string Company { get; set; }

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var claims = ((ClaimsIdentity)Thread.CurrentPrincipal.Identity);
        var claim = claims.Claims.Where(x => x.Type == "Company").FirstOrDefault();

        string privilegeLevels = string.Join("", claim.Value);        

        if (privilegeLevels.Contains(this.Company)==false)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Usuario de Empresa No Autorizado");
        }
    }
}
[HttpGet]
[AutorizeCompany(Company = "MyCompany")]
[Authorize(Roles ="SuperAdmin")]
public IEnumerable MyAction()
{....
}
0
Maurico Bello