Authentication WCF i ASP.NET - architektura trójwartstwowa

0

Razem z kolegami rozpoczynamy projekt i jak to na ogół bywa, na samym początku mamy zapał, więc chcemy wykorzystać architekturę trójwarstwową. Mamy jednak pytanie dotyczące uwierzytelniania. Idea ma być taka:

Jest baza danych użytkowników.
Jest serwis WCF, który ma metody wykorzystywane do operacji na bazie danych (Login(), Register(), GetPersonalSettings(), ...)
Jest strona w ASP.NET (MVC), gdzie użytkownik może się zalogować i 'bawić' się swoim profilem.

Jaki jest problem? Chodzi o logowanie - jak to ogólnie rozwiązać?:
Potrzebujemy uwierzytelniania i w ASP'ie - FormsAuthentication, ale też w WCF. Dlaczego? Bo serwis WCF udostępnie nie tylko metody Login(username, password), ale też GetDataOfUser(username), która powinna być możliwa do wykonania, tylko przez usera zalogowanego.
Pytanie czy to mają być jakieś osobne logowania? Czy logowanie w FormsAuthentication, generuje jakiś token, który pozwoli mi rozpoznać, czy user jest zalogowany też w WCF? Co jak user zaznaczy 'pamiętaj mnie', i logowanie FormsAuthentication w ASP go zapamięta, a w WCF już nie? Nie do końca rozumiem logowanie w WCF, oraz sposób jak połączyć logowanie w ASP.NET i w WCF.

Proszę o pomoc. Wiem, że pytanie trochę długie, ale już dłuższy czas się nad tym zastanawiam. Żaden z nas nie potrafi sobie z tym poradzić, a ciężko też znaleźć jakąś konkretną informację w Googlu.
Dziękuję,
Pozdrawiam

2

Hej

Na początku trzeba się zastanowić, czy WCF będzie używany tylko przez stronę ASP.NET ?

Najłatwiej będzie chyba tak, ze po stronie ASP.NET robisz standardowy mechanizm uwierzytelnienia oparty na sesji. WCF wystawiasz zaś na HTTPS, bądź TCP ale z użyciem certyfikatu (SSL). Certyfikat instalujesz tylko tam, gdzie będzie hostowana strona ASP.NET (jednocześnie WCF będzie odrzucał wszystkie połączenia bez certyfikatu, czyli wszystkie połączenia z innego koma niż hosta strony www).

Tak więc np.

Strona www (podaj login i hasło) --> ASP.NET przekazuje dane (szyfrowane połączenie, wiec nie ma się o co martwić) do WCF do metody np. GetUserId(string userName, string password). Jeśli np. wynik metody jest różny od -1 ustawiasz po stronie ASP.NET wartość w sesji jako indetyfikator użytkownika, bądź wywalasz mu komunikat o błędnym haśle.

Teraz użytkownik chce np. pobrać listę swoich produktów. To podobnie, po stronie ASP.NET sprawdzasz, czy wartość w sesji jest ustawiona -> tak -> wywołujesz metodę z WCF np. GetProduct(int userId).

Tak jak wcześniej wspominałem, WCF nikt nie wywoła z zewnątrz ze względu na brak certyfikatu.

0

Dziękuję bardzo za odpowiedź. Faktycznie wydaje się to być dość dobrym rozwiązaniem. Prawdopodobnie tak właśnie zrobimy w początkowej fazie projektu.

Chciałbym jeszcze spytać co w wypadku, gdy do WCF'a będę chciał się łączyć nie tylko ze strony w ASP.NET. Zdecydowaliśmy się na wykorzystanie architektury trójwarstwowej, ze względu na to, że w przyszłości chcemy (przynajmniej w założeniach) stworzyć klienta mobilnego i desktopowego. Co należy zrobić w takim wypadku?

1

Hej !

Tutaj sprawa troszkę się skomplikuje. Jeśli chodzi o aplikacje mobilne, które wchodzą w grę ? Windows Phone 7/8? W tym przypadku (w przeciwieństwie do hosta www) prawdopodobnie odpada instalacja certyfikatu na komputerze/telefonie klienta. Certyfikat prawdopodobnie (bądź najlepiej) wyeksportować do base64 i zaszyć w app.config bądź bezpośrednio w kodzie. W przypadku aplikacji Windows Phone 7/8 całą logikę można byłoby zaszyć w aplikacji, zaś WCF oprzeć tylko na weryfikacji certyfikatu (tak samo jak przy www). Z Windows Phone (nie wiem jak z innymi platformami, pewnie Android jest najbardziej otwarty) oficjalnie istnieje możliwość instalacji aplikacji tylko przez MarketPlace, a zatem wg mnie nie ma sensu martwić się, czy ktoś może zdekompilować kod i ręcznie wywołać metody na WCF.

Sytuacja inaczej plasuje się w przypadku aplikacji desktopowych. Klient może mieć wgłąb w kod, zatem tutaj trzeba dołożyć dodatkowe mechanizmy. Najłatwiejszym sposobem jest przesyłanie loginu i hasła (opcji jest parę, można dane te przypisać do Credentials w kliencie WCF, przekazywać w nagłówku każdej wiadomości która idzie do WCF, czy też bezpośrednio jako parametr do każdej wywoływanej metody), a następnie dane te weryfikować w hoście WCF.

Podsumowując, jeśli chcecie używać aplikacji www + aplikacji mobilnej, wystarczy WCF + certyfikat (do szyfrowania połączenia) i weryfikacja wszystkiego po stronie klienta.

W przypadku, gdy dojdzie aplikacja desktopowa dodatkowo trzeba będzie dołożyć weryfikację loginu i hasła po stronie WCF.

Musicie się zastanowić, czy robicie wszystko jednakowo, czy rozbijacie "gałęzie". Możliwe jest, żeby najpierw zrobić opcję 1 (WCF + cert.), zaś kiedyś (gdy dojdzie desktop) wstawić inny certyfikat + endpoint, który opakuje wszystko dodatkowo w mechanizm weryfikacji użytkownika i hasła, zaś cały kod odpowiedzialny za logikę bazodanową pozostałby wspólny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1