2012-11-07 13 views
97

Potrzebuję kontrolować dostęp do widoków na podstawie poziomów uprawnień użytkowników (nie ma żadnych ról, są tylko poziomy uprawnień dla poziomów operacji CRUD przypisanych do użytkowników) w moim Aplikacja MVC 4.Niestandardowy atrybut autoryzacji ASP.NET MVC 4 z kodami uprawnień (bez ról)

Przykład poniżej AuthorizeUser będzie moim niestandardowym atrybutem abd muszę go używać jak poniżej.

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

Czy można to zrobić? W jaki sposób? Z góry dzięki ...

Chatura

Odpowiedz

197

Mogę to zrobić z niestandardowym atrybutem w następujący sposób.

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

Niestandardowa klasa atrybutu w następujący sposób.

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

można przekierować nieautoryzowanego użytkownika w swoim zwyczaju AuthorisationAttribute poprzez nadpisanie metody HandleUnauthorizedRequest:

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

Próbowałem swój przykład HandleUnauthorizedRequest ale kiedy określić RouteValueDictionary, to po prostu przekierowuje do mi trasa, która nie istnieje. Dodaje trasę, którą chcę przekierować użytkownika, do trasy, do której użytkownik chciał uzyskać dostęp ... si dostaję coś takiego: localhost: 9999/admin/Strona główna, kiedy chcę localhost: 9999/Home – Marin

+1

@Marin Postaraj się dodać area = string.Empty w RouteValueDictionary – Alex

+25

Byłem na przeglądzie, ale wtedy zobaczyłem "if (warunek) {return true;} else {return false;}" na końcu .... – GabrielBB

1

Oto modyfikacja do poprz. odpowiedź. Główną różnicą jest to, gdy użytkownik nie jest uwierzytelniony, wykorzystuje oryginalną metodę „HandleUnauthorizedRequest” przekierowanie na stronę logowania:

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