2012-08-29 19 views
6

Używam menedżera ról i uwierzytelniania systemu Windows dla mojego projektu asp.net mvc mamy 2 role, które są przeglądarkami i edytorami.Asp.net Menedżer ról MVC

<authentication mode="Windows" /> 
    <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"> 
     <providers> 
      <clear /> 
      <add applicationName="/" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     </providers> 
    </roleManager> 

Edytor może uzyskać dostęp do całej aplikacji, ale Viewer może uzyskać dostęp tylko dwie akcje

raz pierwszy starał się umieścić atrybut upoważniać do sterownika bazowego, który właśnie pozwoli edytor dostęp do wszystkiego:

[Authorize(Roles = "Editors")] 
public class BaseController : Controller 

i następnie dodaj atrybut Authorize do tych dwóch działań:

[Authorize(Roles = "Viewers,Editors")] 
public ActionResult Report(PaymentsUnallocatedAndQueriedModel model) 

to nie działa, nie pozwala widzowi uzyskać dostępu do akcji, które mają teraz sens.

Uważam, że nie jest dobrym pomysłem powtarzanie atrybutu Autoryzuj na górze każdej akcji.

mógłbyś mi powiedzieć, czy istnieje lepsze rozwiązanie tego

Odpowiedz

5

trzeba spojrzeć na to z perspektywy drzewa. Aby dostać się do akcji, musisz najpierw dostać się do kontrolera. W takim przypadku ograniczyłeś kontroler do grupy Redaktorzy, więc Widzowie nie mogą zajść tak daleko. Najprawdopodobniej bardziej pomocne byłoby ograniczenie kontrolera do Viewers, Editors, a następnie w działaniach, które wymagają uprawnienia tylko dla edytora, należy je określić. Spowoduje to wygenerowanie nadmiarowych atrybutów, ale uwzględnij koszt kodu, jeśli musisz ręcznie ograniczyć każde działanie w oparciu o przynależność do roli.

[Authorize(Roles = "Viewers, Editors")] 
public class BaseController : Controller 
{ 

    [Authorize(Roles = "Editors")] 
    public ActionResult EditReport(PaymentsUnallocatedAndQueriedModel model) 
    { 
     // Some editor only functionality 
    } 

    public ActionResult Report(PaymentsUnallocatedAndQueriedModel model) 
    { 
     // Some functionality for both. No attribute needed 
    } 
} 
+0

Dzięki za odpowiedź, miałem nadzieję, aby nie powtarzać zezwolić na górze każdej akcji, ponieważ redaktorzy mogą uzyskać dostęp do co akcje, ale wydaje się, nie ma innego sposobu – Elham

+0

@Elham: Zawsze można spojrzeć na to SO zapytaj i zaimplementuj atrybut odmowy. Wydaje się, że jest to dużo pracy po prostu dlatego, że nie chcesz wpisywać atrybutu dla metody. http://stackoverflow.com/questions/4011458/mvc-authorize-attribute-deny –

Powiązane problemy