鑑於wcf rest服務與HttpClientCredentialType.Windows一起運行並強制用戶通過Kerberos進行身份驗證。WCF Rest服務通過瀏覽器進行Windows身份驗證
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();
}
當我運行這是一個控制檯應用程序,然後在Internet Explorer中從另一臺計算機打開網頁http://notebook50:87/test/
,我得到一個「錯誤的請求」的響應。 我確實啓用了kerberos日誌記錄,它顯示我KDC_ERR_PREAUTH_REQUIRED
我可以通過創建一個windows服務來解決這個問題,並在'本地系統帳戶'下運行它。 在這種情況下,客戶端能夠進行身份驗證。
問題:用戶(運行此wcf服務)需要什麼權限/設置才能獲得與應用程序在本地系統下以windows服務運行時相同的行爲? 這與服務原則名稱有關嗎?
如果您在筆記本上創建共享文件夾50,並嘗試從其他計算機訪問它,會發生什麼情況?它是否提示登錄?如果您使用登錄表單登錄,然後嘗試訪問http:// notebook50:87/test /,那麼它會起作用嗎? – 2014-09-05 06:44:30
「這與服務主體名稱相關」很可能。我的第一個問題是爲什麼你在使用Kerberos,我過去花了兩個星期的時間無情地調試Kerberos(你確定你不能使用NTLM)。其次,Kerberos需要大量的東西才能正常工作,其中之一就是客戶端需要對服務器進行身份驗證......這就是SPN的功能。 SPN必須與你用於訪問服務器的DNS條目相匹配(在這種情況下,notebook50幾乎可以肯定不是,默認情況下,如果發生這種情況,它將被設置爲服務器的FQDN)。 – Aron 2014-09-05 06:47:08
@ Magic-Mouse對不起老兄。您的評論沒有幫助。這顯然是Kerberos身份驗證的一個問題。 – Aron 2014-09-05 06:48:04