2009-07-29 9 views
5

Podoba mi się atrybut Authorize ASP.Net MVC, mogę go rozszerzyć i zbudować własną logikę i udekorować nią swój kontroler. ALE,Zapisywanie niestandardowego atrybutu w C# jak ASP.Net MVC Autoryzuj atrybut

W mojej architekturze mam jedną wspólną warstwę usług (biblioteka klasy C#). Użytkownik końcowy może uzyskać dostęp do mojej aplikacji za pośrednictwem strony internetowej ASP.Net MVC lub za pośrednictwem mojej odsłoniętej warstwy usługi REST WCF Webservice. Moja aplikacja asp.net MVC i warstwa usługi WCF REST z kolei uzyskują dostęp do mojej wspólnej warstwy usług.

Chcę, aby autoryzacja odbywała się w tej wspólnej warstwie usług, a nie w kontrolerach ASP.Net MVC lub w mojej odsłoniętej warstwie usługi REST.

Czy mogę utworzyć atrybut ASP.Net MVC Authorize podobny do dekoracji moich metod w wspólnej bibliotece klasy C#? Ten atrybut pobierze parametry i zdecyduje, czy bieżący użytkownik ma dostęp do tej funkcji, czy nie?

Dzięki & Pozdrawiam, Ajay

Odpowiedz

5

To, czego szukasz, można uzyskać za pomocą biblioteki AOP, takiej jak PostSharp (http://www.postsharp.org/). Jest bardziej skomplikowany niż użycie atrybutu Authorize w mvc, ale nadal jest dość prosty.

+0

wielkie dzięki. postsharp wygląda dobrze. Zajmuję się tym teraz. Mam nadzieję, że moja architektura będzie miała dobry impuls. – Ajay

1

Nie, AuthorizeAttribute działa, ponieważ ramy MVC wyraźnie powołuje go przed wywołaniem metody. Podobna funkcja dla warstwy usługi działałaby tylko wtedy, gdyby klienci również ją jawnie wywołali. Nie byłoby rozsądnym założenie, że nawet klient o dobrych intencjach zawsze będzie pamiętać, aby wyszukać atrybut i go przywołać. WCF has its own security. Powinieneś użyć tego zamiast pisać własne.

+0

Jeśli umieściłem logikę autoryzacji w moich interfejsach API usług REST, wówczas będę musiał je również powielić w kontrolerach. To dlatego muszę zrobić coś, co jest w warstwie usługi (nie WCF, tylko biblioteka klasy C#) – Ajay

+0

Nie musisz duplikować niczego. WCF i ASP.NET powiedzą ci * kto * jest podłączony. Musisz po prostu przetłumaczyć to na * co * mogą zrobić. Ten kod może być udostępniony. Nie powinieneś robić tego z atrybutem niestandardowym, to wszystko, co mówię. Wykorzystaj to, co jest już wbudowane w ramy. –

+0

Co się stanie, jeśli zdecyduje się dodać kolejny przedni koniec? Będzie musiał ponownie zapisać wszystkie te cechy. Co się stanie, jeśli zmieni niektóre zasady, na przykład jakie grupy mogą wywoływać metodę? Będzie musiał zmienić wszystkie swoje frontendy. Istnieje możliwość utworzenia takiego atrybutu (z dodatkiem) i uważam, że Ajay powinien to zrobić, ponieważ tylko w ten sposób może zapewnić, że autoryzacja jest spójna dla wszystkich frontów i że może bezpiecznie dodać kolejny interfejs i nie Troszczyć się o wszystkie autoryzacje, które są wspólne dla wszystkich frontendów ... – maciejkow

0

To nie powinno być zbyt trudne do zrobienia - istnieje kilka miejsc, które można zastanowić się atrybut i obsługiwać go odpowiednio:

  • Na starcie programu w Global.asx można dostosować routing i lokalizacje dla poglądów

  • Bazowe ASP.Net zdarzenia żądania nadal ognia, więc można zastąpić jednego z nich

  • Stwórz własną podstawowy kontroler i zastąpić OnActionExecuting


Aktualizacja następujący komentarz

Ach, widzę. W takim przypadku, jeśli wykonujesz połączenia bezpośrednie, powinieneś sprawdzić numer Code Access Security, który moim zdaniem obejmuje to, co masz na myśli.

Alternatywnie, atrybut niestandardowy może mieć sens, o ile używasz jakiegoś wzoru fabrycznego - wtedy wywołanie odbicia, które dostaje fabryka, może sprawdzić atrybuty.

Jeśli nie używasz refleksji do pobierania klas lub wywoływania metod (co w istocie ma miejsce w przypadku routingu w MVC), wtedy nie będziesz mieć szansy na sprawdzenie swoich atrybutów.

+1

w ASP.Net MVC mogę to zrobić, muszę zrobić to samo w bibliotece klasy C#, aby każdy, kto wywołuje metodę C#, powinien wykonać sprawdzanie autoryzacji. Dzięki. – Ajay

2

Innym sposobem radzenia sobie z tym problemem jest użycie atrybutu [PrincipalPermission] w warstwie usług. Może to uniemożliwić wywołującym wykonanie metody (lub uzyskanie dostępu do całej klasy) bez zdefiniowanej autoryzacji.

Powiązane problemy