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?

Author: LeftyX, 2011-05-18

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>
 23
Author: Xhalent,
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;
        }
 6
Author: Jeremy Hobbs,
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