2 min to read
Delegacja w AD i IIS

Dziś zamierzam opisać proces delegacji pomiędzy witrynami na różnych serwerach w kontekście jednej domeny.
Po co?
Generalnie wymyśliłem sobie przypadek w którym mam aplikację numer 1 i aplikację numer 2.
Authentication w obu aplikacjach jest ustawione na “Windows Authentication”. W app1 wyświetlam aktualnego użytkownika używając:
@User.Identity.Name w widoku MVC.
App2 będzie zwracać poprzez web api również aktualnego użytkownika. Całą sytuację możemy zasymulować poprzez kod zaprezentowany poniżej. Zwykły kontroler:
public class HomeController : Controller
{
public string Index()
{
return User.Identity.Name;
}
public string Go(string id)
{
var client = new RestClient($"http://{id}");
var request = new RestRequest("api/values", Method.GET)
{
UseDefaultCredentials = true
};
var response = client.Execute(request);
var content = response.Content;
return content;
}
}
oraz kontroler web api:
public class ValuesController : ApiController
{
public string Get()
{
return User.Identity.Name;
}
}
Instalując aplikację na IIS wykonując akcje Index i Go dostaniemy 2 różne wyniki.
Index zwróci mi aktualnie zalogowanego użytkownika - czyli “Artur”,
a Go zwróci użytkownika który jest ustawiony na puli aplikacji.
http://webserver/Home/Go/webserver -> IISPoolUser
http://webserver/home/index -> Artur
W takim razie jak to zrobić, żeby mimo wszystko http://webserver/Home/Go/webserver zwracał użytkownika Artur?
Po pierwsze do web.config należy dodać wpis:
<authentication mode="Windows" />
<identity impersonate="true" />
W Active Directory należy ustawić delegację dla użytkownika który jest ustawiony na puli naszej aplikacji.
Delegację można dodać dopiero wtedy kiedy na naszym użytkowniku jest ustawiony SPN.
SPN ustawiamy w ten sposób:
setspn -s HTTP/nazwa_serwera_www moja_domena\użytkownik_puli
Aby ustawić delegację w ADUC (Active Directory Users and Computers) wybieramy użytkownika technicznego użytkownik_puli i przechodzimy do zakładki delegacji, która powinna się pojawić po ustawieniu SPN’ów. Zaznaczamy “Trust this user for delegation to specified services only” - i dodajemy nową usługę - z znalezionegej maszynę na którym jest zainstalowany nasz IIS i wybieramy usługę HTTP.
Zapisujemy zmiany i to już koniec.
Po tych operacjach http://webserver/Home/Go/webserver i http://webserver/home/index zwracają tego samego użytkownika.
Na 2 hop’y, przekazywanie uprawnień działa bez SPN’a, powyżej 2 “mykiem” jest właśnie SPN żeby zadziałało
Comments