Delegowanie w serwisie internetowym WCF

Mam usługę internetową WCF, obecnie obsługiwaną przez punkt końcowy WSHttpBinding z zabezpieczeniami transportu i typem poświadczeń klienta Windows. Usługa jest hostowana w oparciu o IIS 5.1 ze skonfigurowanym protokołem SSL przy użyciu certyfikatu z urzędu certyfikacji domeny. Same usługi IIS działają z tożsamością [email protected] na komputerze domeny. Dostęp anonimowy jest wyłączony, a zintegrowane uwierzytelnianie systemu Windows jest jedynym sposobem uwierzytelnienia.

Usługa posiada metodę zwracającą aktualną nazwę tożsamości systemu Windows i poziom personifikacji. Metoda ma wartość Impersonation ustawioną na Required w swoim OperationBehaviourAttribute.

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public IEnumerable<string> GetInformation()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    return new List<string>()
    {
        identity.Name,
        identity.ImpersonationLevel.ToString()
    };
}

Buduję kanał WCF ręcznie w kliencie i zezwalam na delegowanie usługi.

WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType =
    HttpClientCredentialType.Windows;

EndpointAddress endpoint =
    new EndpointAddress("https://host/DelegateService/Service.svc");

ChannelFactory<ServiceInterface.IService> cf =
    new ChannelFactory<ServiceInterface.IService>(binding, endpoint);

cf.Credentials.Windows.AllowedImpersonationLevel =
    TokenImpersonationLevel.Delegation;

ServiceInterface.IService service = cf.CreateChannel();

Klientem jest w pełni zaufany XBAP podpisany certyfikatem domeny, który został przeniesiony do magazynu certyfikatów Trusted Publishers.

Na komputerze hosta, [email protected] i [email protected], w domenie skonfigurowano opcję Zezwalaj na delegowanie i żaden z użytkowników nie jest oznaczony jako wrażliwy. SeImpersonatePrivilege również nie powinno stanowić problemu, ponieważ Impersonation działa.

Gdy klient wywołuje metodę usługi, metoda zwraca „domena\bieżący” i „Impersonation”. Potrzebuję „domeny\bieżącej” i „Delegacji”. Zgodnie z drugą tabelą pod adresem http://msdn.microsoft.com/en-us/library/ms730088.aspx oznaczałoby to, że klient lub usługa nie mają możliwości delegowania.

Domena posiada poziom funkcjonalności Windows 2000 Mixed. Czytałem gdzieś, że oznacza to uwierzytelnianie NTLM, ale uważam, że odnosiło się to do ruchu między kontrolerami domeny. Gdy nie działa na https, Wireshark pokazuje supportedMech: 1.2.840.48018.1.2.2 (MS KRB5 - Microsoft Kerberos 5) w odpowiedzi http, więc wygląda na to, że Kerberos jest włączony.

Technicznie rzecz biorąc, moglibyśmy podnieść poziom funkcjonalności do systemu Windows 2003, ponieważ oba kontrolery domeny, które posiadamy, to oba serwery W2K3, ale dział IT nie jest obecnie w stanie przydzielić zasobów do operacji tworzenia kopii zapasowych i takich, które chce wykonać przed ich wykonaniem i podniesieniem funkcjonalności poziom.

Mamy wirtualną domenę testową, którą można uaktualnić do poziomu funkcjonalnego systemu Windows Server 2003, ale w tej domenie brakuje urzędu certyfikacji lub komputerów klienckich z zainstalowanymi usługami IIS, więc chociaż poziom funkcjonalności można podnieść do celów testowych, konfigurując resztę infrastruktury to sporo pracy.

Jest to problem, z którym od jakiegoś czasu nie mogę sobie poradzić. Wydaje się, że w Internecie pełno jest artykułów typu „Tak się to robi”, ale nie miałem z nimi szczęścia. Jakieś pomysły, co jest nie tak?


person Mikko Rantanen    schedule 26.04.2009    source źródło


Odpowiedzi (1)


Czy używasz XBAP i usługi na tym samym hoście IIS?

Jeśli dobrze rozumiem - masz: klient->XBAP->WCF.

Klient łączy się z XBAP hostowanym w IIS. Może to oznaczać uwierzytelnianie za pośrednictwem protokołu Kerberos i wydaje się, że tak jest.

Drugim przeskokiem jest wówczas połączenie XBAP z usługą WCF. Jeśli te dwa serwery są hostowane na tym samym hoście IIS, próba protokołu Kerberos nie zostanie podjęta i zostanie użyty protokół NTLM. Próba protokołu Kerberos zostanie tylko podjęta, jeśli funkcja WCF znajduje się na innym komputerze hosta.

Jeśli masz XBAP i WCF hostowane na oddzielnych urządzeniach, masz klasyczną konfigurację uwierzytelniania Kerberos przez drugi przeskok i każdy z artykułów typu „Tak to robisz” powinien to wyjaśnić.

(Zdaję sobie sprawę, że to pytanie było jakiś czas temu - ale dopiero niedawno je znalazłem i dopiero niedawno zrozumiałem problemy z Kerberosem i 2-hopami.)

person Grhm    schedule 24.12.2010
comment
Podstawowy problem został rozwiązany jakiś czas temu. Scenariusz z XBAP miał być najprostszym sposobem na odtworzenie braku uwierzytelnienia, więc zgubiłem tę konfigurację i nie mogę przetestować, co poszło nie tak. Chociaż teraz ciekawi mnie XBAP hostowany w części IIS: pochodzenie XBAP ma znaczenie, nawet w przypadku w pełni zaufanych XBAP? Przyznaję, że nie przyglądałem się im zbyt szczegółowo, ale założyłem, że jeśli chodzi o pracę w sieci, zachowują się jak każda samodzielna aplikacja .Net. - person Mikko Rantanen; 26.12.2010