Mam aplikację C# oraz zewnętrzną baza danych, która przechowuje informacje nt. użytkowników (zwykłych i adminów). Teraz chciałbym aby mój program umożliwiał rózne funkcje z zależności od tego na jakiego typu konto się zalogujemy. I teraz pytanie jak to poprawnie zaprojektować, chodzi mi o sam mechanizm logowania. Zrobić jakąś klasę "System" która będzie miała funkcje: Login(), Logout(), ChangePassword(), ChangeInformation(), IsAdmin() itp? Czy robi się to jakoś inaczej? To mój 1 projekt do portfolio temu chciałbym to zrobić ok.

- Rejestracja:ponad 12 lat
- Ostatnio:7 miesięcy
- Postów:6610
http://stackoverflow.com/questions/1222974/authentication-authorization-user-and-role-managment-and-general-security-in
http://www.codeproject.com/Articles/29853/User-Login-For-WinForm-Applications
albo napisać własny system co jest chyba dość powszechne w aplikacjach desktopowych.

- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:627
Na razie masz użytkowników zwykłych i adminów. Za jakiś czas okaże się, że konieczny jest pomocnik admina, i będziesz mnożył niepotrzebnie byty. W uproszczeniu - logowanie to pobranie danych do logowania, sprawdzenie ich poprawności, zalogowanie (lub nie) i ewentualnie pobranie uprawnień, a te będą zależne od typu użytkownika, na koniec zapisanie sobie statusu tych operacji (taki log logowania :D). Część dotyczącą uprawnień należy napisać tak, by dodanie kolejnych praw do danych operacji/miejsc w programie nie powodowało zmiany kodu.
Można od razu przy okazji dodać, że nie warto przechowywać w bazie haseł pisanych czystym tekstem, a przy jakimś ich kodowaniu trzeba je dosolić.
Dzięki za odpowiedź ;) A więc ja widzę to tak: tworzę klasę AuthorizationManager
, która jest odpowiedzialna tylko i wyłącznie za autoryzację użytkowników, także będzie ona miała dwie publiczne metody:
Login(string username, string password); Logout();
W metodzie Login()
będę łączył się z bazą danych i sprawdzał czy podane dane do logowania się zgadzają, jeśli tak będę tworzył odpowiedni obiekt GenericPrincipal()
i GenericIdentity()
i przypisywał go do wątku. Następnie tworzę klasę UserPanel
, która będzie miała odpowiednio metody: ChangePassword()
, ChangeInfo()
, AddAction()
, .... Nie które z tych funkcji będą wymagały praw administratora i będę właśnie na podstawie atrybutu:
[PrincipalPermission(SecurityAction.Demand, Role = Roles.Administrator)]
Takie podejście jest ok?
Mam jeszcze jedno pytanie czy klasy AuthorizationManager i UserPanel powinny być zaimplementowane jako statyczne klasy, singletony czy może inaczej?
dodanie znaczników `` i <code class="csharp">
- @furious programming

napisaną
w C#