2012-11-07 10 views
97

Devo controllare l'accesso alle viste in base ai livelli di privilegio degli utenti (non ci sono ruoli, solo i livelli di privilegio per i livelli di operazione CRUD assegnati agli utenti) nel mio Applicazione MVC 4.ASP.NET MVC 4 Attributo di autorizzazione personalizzato con codici di autorizzazione (senza ruoli)

Esempio come sotto AuthorizeUser sarà il mio attributo personalizzato abd Devo usarlo come di seguito.

È possibile fare? Come? Grazie in anticipo ...

Chatura

risposta

197

ho potuto fare questo con un attributo personalizzato come segue.

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

Classi di attributi personalizzati come segue.

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

È possibile reindirizzare un utente non autorizzato nella vostra abitudine AuthorisationAttribute sovrascrivendo il metodo HandleUnauthorizedRequest:

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

Ho provato il tuo esempio di HandleUnauthorizedRequest ma quando ho specificare il RouteValueDictionary, reindirizza solo per io un percorso che non esiste. Si aggiunge il percorso che voglio reindirizzare l'utente a al percorso che l'utente ha voluto l'accesso ... si ottengo qualcosa di simile: localhost: 9999/admin/casa quando volevo localhost: 9999/Casa – Marin

+1

@Marin Prova ad aggiungere area = string.Empty in RouteValueDictionary – Alex

+25

Stavo facendo l'upvoting ma poi ho visto "if (condition) {return true;} else {return false;}" alla fine .... – GabrielBB

1

Ecco una modifica per la prev. risposta. La differenza principale è quando l'utente non è autenticato, utilizza il metodo originale "HandleUnauthorizedRequest" per reindirizzare alla pagina di login:

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); 
     } 
    } 
Problemi correlati