2014-09-02 31 views
5

Podano usługi reszta wcf, która działa z HttpClientCredentialType.Windows i wymusza na użytkowniku uwierzytelnianie przez Kerberos.Usługa spoczynku WCF Uwierzytelnianie systemu Windows za pomocą przeglądarki

 private static void Main(string[] args) 
    { 
     Type serviceType = typeof (AuthService); 
     ServiceHost serviceHost = new ServiceHost(serviceType); 

     WebHttpBinding binding = new WebHttpBinding(); 
     binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly; 
     binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 

     ServiceEndpoint basicServiceEndPoint = serviceHost.AddServiceEndpoint(typeof(IAuthService), binding, "http://notebook50:87"); 
     basicServiceEndPoint.Behaviors.Add(new WebHttpBehavior()); 

     Console.WriteLine("wcf service started"); 
     serviceHost.Open(); 
     Console.ReadLine(); 
    } 

    public class AuthService : IAuthService 
{ 
    public List<string> GetUserInformation() 
    { 
     List<string> userInfo = new List<string>(); 
     userInfo.Add("Environment.User = " + Environment.UserName); 
     userInfo.Add("Environment.UserDomain = " + Environment.UserDomainName); 
     if (OperationContext.Current != null && OperationContext.Current.ServiceSecurityContext != null) 
     { 
      userInfo.Add("WindowsIdentity = " + OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name); 
      userInfo.Add("Auth protocol = " + OperationContext.Current.ServiceSecurityContext.WindowsIdentity.AuthenticationType); 
     } 
     else 
     { 
      userInfo.Add("WindowsIdentity = empty"); 
     } 
     WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"; 
     return userInfo; 
    } 
} 

[ServiceContract] 
public interface IAuthService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "test/")] 
    List<string> GetUserInformation(); 
} 

gdy ten jako aplikację konsoli, a następnie otworzyć stronę w przeglądarce Internet Explorer http://notebook50:87/test/ z innego komputera, pojawia się „złe żądanie” odpowiedzi. Włączyłem rejestrowanie kerberos i pokazuje mi KDC_ERR_PREAUTH_REQUIRED

Mogę rozwiązać ten problem, tworząc usługę Windows i uruchamiać ją w "Local System account". W takim przypadku klient może uwierzytelnić się.

Pytanie: Jakie uprawnienia/ustawienia wykonuje użytkownik (który uruchamia tę usługę wcf), aby uzyskać takie samo zachowanie, jak w przypadku, gdy aplikacja działa jako usługa Windows w systemie lokalnym? Czy jest to związane z nazwą zasady obsługi?

+0

Co się stanie, jeśli udostępnisz folder współdzielony na notebook50 i spróbujesz uzyskać do niego dostęp z innego komputera? Czy monituje o zalogowanie? Jeśli logujesz się za pomocą formularza logowania, a następnie spróbuj uzyskać dostęp do http: // notebook50: 87/test/czy to działa? –

+0

"Czy jest to związane z Nazwą Zasad Serwisowych" całkiem możliwe. Moje pierwsze pytanie brzmi: DLACZEGO korzystasz z protokołu Kerberos, w przeszłości spędzałem 2 tygodnie bez owocnego debugowania Kerberosa (czy na pewno nie możesz używać NTLM). Po drugie, Kerberos wymaga ogromnej ilości rzeczy, aby się do niego dostać, jednym z nich jest to, że klient musi uwierzytelnić serwer ... i to właśnie jest nazwa SPN. SPN MUSI pasować do wpisu DNS, którego używasz w celu uzyskania dostępu do serwera (w tym przypadku notebooka50, co jest prawie na pewno NIE, tak jak domyślnie, gdyby to się stało, byłby ustawiony na nazwę FQDN twojego serwera). – Aron

+1

@ Magic-Mouse Wybacz koleś. Twój komentarz nie jest pomocny. Jest to wyraźnie problem z uwierzytelnianiem Kerberos. – Aron

Odpowiedz

3

Działa teraz. To naprawdę był problem z SPN Na początku ustawiłem SPN jak setpn -A HTTP/notebook50.foo.com, a przy tym uwierzytelnianie Kerberos nie działało.

Teraz ustawiłem to jako setspn -A HTTP/notebook50.foo.com nazwa użytkownika gdzie nazwa użytkownika jest użytkownikiem, pod którym działa usługa.

Z dokumentacji SPN, którą przeczytałem, nie było dla mnie jasne, że muszę ustawić konto użytkownika w ten sposób.

Byłoby świetnie, gdyby można było wyjaśnić, co się tutaj dzieje, i prawdopodobnie link do dokumentacji dla tego scenariusza.

0

Możesz zatrzymać pojawienie się tego błędu, włączając opcję "Nie wymagaj wstępnego uwierzytelniania Kerberos" dla tego konta użytkownika w Active Directory users & komputery -> właściwości -> konto.

+0

Zrobiłem tę właściwość dla konta użytkownika, które uruchamia usługę Windows. Nadal nie działa. Teraz błąd w logu systemowym: KRB_AP_ERR_MODIFIED. Ale gdy tylko przełączę użytkownika na "system lokalny", wszystko działa. – Manuel

+0

Zgodnie ze specyfikacją msdn, KRB_AP_ERR_MODIFIED może zająć kiedy: 1.Niedopasowane rozpoznawanie nazw DNS - Problem występuje bardzo często w środowisku równoważenia obciążenia sieciowego, które używa mnożących się sieci IP lub/i mnoży adaptery sieciowe. 2. Użytkownik nie ma uprawnień dostępu do lokalnego systemu plików NTFS. 3. Witryna korzysta z puli aplikacji ze słabymi ustawieniami uprawnień. – Frix33

+0

Sprawdź, czy ten kb może ci pomóc: [link] (http://support.microsoft.com/kb/558115) – Frix33