ASP.NET uwierzytelnianie MVC i Windows z niestandardowymi rolami
Próbuję zaimplementować uwierzytelnianie systemu windows w moim ASP.NET aplikacja MVC2. Wykonałem wszystkie kroki sugerowane przez oficjalną dokumentację:
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
Podałem uwierzytelnianie NTLM. Jak na razie dobrze. Wszystko działa dobrze.
Chciałbym sprawdzić zalogowanych użytkowników w mojej bazie danych.
Chciałbym pobrać role z mojej tabeli, a następnie zarządzać autoryzacją za pomocą niestandardowego atrybutu.
nie chcę korzystać z członkostwa i dostawcy ról.
Już mam moje tabele użytkownicy / role na miejscu, ponieważ zostały one wykorzystane w aplikacji internetowej(jest to aplikacja Intranet).
W mojej aplikacji internetowej miałem formularz, w którym użytkownik wprowadza dane. Formularz jest wysyłany do administratora, który sprawdza wszystko i tworzy plik cookie z użytkownikiem (i rolami) zalogowanego użytkownika.
In my global.asax uwięziłem Zdarzenie AuthenticateRequest, w którym przeczytałem plik cookie i utworzyłem Niestandardowy principal, którego używam w całej aplikacji, aby sprawdzić autoryzacje.
Jak mogę to zaimplementować przy uwierzytelnianiu systemu Windows?
2 answers
Wystarczy utworzyć nowy główny i przypisać go do użytkownika i wątku w Global.asax (lub użyć filtra akcji).
protected void Application_AuthenticateRequest(object sender, EventArgs args)
{
if(HttpContext.Current != null)
{
String [] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name);
GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);
Thread.CurrentPrincipal = HttpContext.Current.User = principal;
}
}
Jeśli Użytkownik nie ma żadnej pasującej roli, może zostać wykluczony z aplikacji za pomocą Internetu.element konfiguracji:
<authorization>
<allow roles="blah,whatever"/>
<deny users="*"/>
</authorization>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-18 11:45:47
Aby dodać do powyższej odpowiedzi, mam nadzieję, że zaoszczędzi to trochę czasu.
Mam witrynę intranet MVC 5 Z VS 2015.
Kod nie działał dla mnie, dopóki górna linia nie została zaktualizowana za pomocą HttpContext.Aktualne.Użytkownik. Witryna dawała mi zerowe odniesienie do HttpContext.Aktualne.Użytkownik, jeśli użytkownik nie został jeszcze utworzony w bazie danych. Przez dodanie .Użytkownika do pierwszej linii, ominął ten kod przy pierwszym ładowaniu i zadziałał.
if (HttpContext.Current.User != null)
{
String[] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name);
GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);
Thread.CurrentPrincipal = HttpContext.Current.User = principal;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 03:56:05