2013-05-21 8 views
8

Buduję aplikację asp.net mvc web api i nie wiem, jak robić elementy członkostwa.Dostawca ról/członkostwo? Jak w asp.net web api?

W moim obecnym projekcie mam to

Mój własny Users Table i Role Table nie używam członkostwa asp.net jak to przynosi zbyt dużo bagażu i nie pasuje jak chcę zaprojektować bazę danych (na pewno mogę się można to jednak wydaje mi się dużo pracy)

user mieć wiele ról a role może mieć wielu użytkowników.

Używam EF do wykonywania prawie wszystkich moich połączeń z bazą danych.

W poprzednich projektach wykonałem własne Authorize Attribute, co zrobiłem w swoim własnym wywołaniu w mojej bazie danych i sprawdziłem, czy użytkownik był w prawidłowej roli, jak to było dozwolone w tym kontrolerze/metodzie działania.

Nie robiąc żadnych dostawców członkostwa, straciłem część wbudowanych funkcji, takich jak User.IsInRole. Nadal byłem w stanie używać User.Identity.Name, ale myślę, że to z powodu ustawionego przeze mnie cookie.

Jaki jest najlepszy sposób na zrobienie tego teraz w asp.net mvc 4/web api?

Podczas googlowania znalazłem "SimpleMembership", ale nie czytałem jeszcze zbyt wiele.

Na marginesie mogę użyć User.Identity.Name z moją webapi, jeśli uwierzytelniłem użytkownika?

Odpowiedz

4

Oto article that describes how to create a custom authorize attribute for Web API's using SimpleMembership. Nie musisz używać SimpleMembership, mimo że jest bardzo elastyczny i łatwy w użyciu. Możesz użyć tych samych koncepcji w tym artykule i zamiast tego użyć usługi członkostwa, o ile Twoja usługa może sprawdzić, czy dany użytkownik jest w roli, zalogować użytkownika i wylogować się oraz zweryfikować, czy są one uwierzytelnione.

Jeśli twoja usługa nie sprawdza, czy są uwierzytelnione, możesz użyć User.Identity.IsAuthenticated i możesz użyć User.Identity.Name, aby uzyskać aktualnie zalogowaną nazwę użytkownika; zakładając, że twoja usługa poprawnie ustawia Thread.CurrentPrincipal, gdy użytkownik się loguje. Zaleca się także ustawienie HttpContext.Current.User. Oczywiście nie musisz się o to martwić, jeśli używasz SimpleMembership.

Ten niestandardowy atrybut autoryzacji obsługuje zarówno uwierzytelnianie formularzy, jak i podstawowe uwierzytelnianie w przypadku publicznego udostępnienia interfejsu API. Różni się on od atrybutu autoryzacji używanego na kontrolerze, ponieważ zwraca kod statusu HTTP zabroniony, jeśli nie są autoryzowane i nieautoryzowane, jeśli nie są uwierzytelnione; zamiast przekierowywać na stronę logowania.

0

Nadal można napisać dostawcę niestandardowego członkostwa i wdrożyć tylko te metody, których chcesz użyć. Jeśli chodzi o numer User.IsInRole, można napisać dostawcę roli niestandardowej, dziedzicząc z klasy RoleProvider i rejestrując go w pliku web.config.

A jeśli nie chcesz używać żadnej z wbudowanych funkcji, dobrze, to nie używaj ich i zamiast pisać User.IsInRole napisz MyService.IsInRole. To naprawdę kwestia osobistych preferencji, czy chcesz rzucić niestandardowych dostawców i korzystać z wbudowanych funkcji lub po prostu napisać warstwę usług, która zajmie się tym dla ciebie. Myślę, że wybór będzie zależał od wielu czynników, które należy wziąć pod uwagę i które są związane ze specyfiką twojego projektu. Na przykład, jeśli w przyszłości zamierzasz pracować nad tym projektem przez innych zewnętrznych deweloperów, rozsądniej byłoby wybrać niestandardowe członkostwo i dostawców ról, ponieważ istnieje duże prawdopodobieństwo, że programiści będą bardziej zaznajomieni z tym interfejsem API, zamiast uczyć się niestandardowego warstwa usługowa.

+0

Jak o User.Identity.Name jak to ustawić w asp.net webapi? W poprzedniej aplikacji mvc 3 miałem w moim niestandardowym atrybucie autoryzacji to: httpContext.User.Identity.Name, a następnie użyłem swojej własnej warstwy usług o tej nazwie, aby dowiedzieć się, jakie uprawnienia posiadał użytkownik. Czy mogę użyć httpContext.User.Identity.Name, jak myślałem, że został ustawiony przez cookie? – chobo2

+0

Tak, możesz mieć niestandardowy atrybut autoryzacji i ustawić "Thread.CurrentPrincipal" dla odpowiedniego użytkownika. Spójrz na przykładową implementację, którą napisałem, która używa dostawcy członkostwa z podstawowym uwierzytelnieniem: http://stackoverflow.com/a/11536349/29407 W tym przykładzie użyłem niestandardowego programu obsługi delegowania, ale możesz użyć filtra autoryzacji, jeśli także chcesz. –

+0

Cool, który jest bardzo pomocny. Mam jednak kilka pytań. Dlaczego Async? Dlaczego musisz zarejestrować program obsługi (nie zrobiłem i User.Identity jest wypełniony, ale nie dokonałem asynchronizacji), po co wypełniać role, ponieważ nie wiesz, jak uzyskać do nich dostęp. – chobo2