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?
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? –
"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
@ Magic-Mouse Wybacz koleś. Twój komentarz nie jest pomocny. Jest to wyraźnie problem z uwierzytelnianiem Kerberos. – Aron