2014-09-02 149 views
5

鑑於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服務運行時相同的行爲? 這與服務原則名稱有關嗎?

+0

如果您在筆記本上創建共享文件夾50,並嘗試從其他計算機訪問它,會發生什麼情況?它是否提示登錄?如果您使用登錄表單登錄,然後嘗試訪問http:// notebook50:87/test /,那麼它會起作用嗎? – 2014-09-05 06:44:30

+0

「這與服務主體名稱相關」很可能。我的第一個問題是爲什麼你在使用Kerberos,我過去花了兩個星期的時間無情地調試Kerberos(你確​​定你不能使用NTLM)。其次,Kerberos需要大量的東西才能正常工作,其中之一就是客戶端需要對服務器進行身份驗證......這就是SPN的功能。 SPN必須與你用於訪問服務器的DNS條目相匹配(在這種情況下,notebook50幾乎可以肯定不是,默認情況下,如果發生這種情況,它將被設置爲服務器的FQDN)。 – Aron 2014-09-05 06:47:08

+1

@ Magic-Mouse對不起老兄。您的評論沒有幫助。這顯然是Kerberos身份驗證的一個問題。 – Aron 2014-09-05 06:48:04

回答

3

它現在正在工作。 它確實是SPN的問題 在開始時,我已將SPN設置爲setpn -A HTTP/notebook50.foo.com,因此,kerberos身份驗證不起作用。

現在,我已將它設置爲setspn -A HTTP/notebook50.foo.com用戶名其中username是運行該服務的用戶。

從我讀過的SPN文檔中,我不清楚我必須以這種方式設置用戶帳戶。

如果能夠解釋此處發生的情況並且可能是此場景文檔的鏈接,那將是非常棒的。

0

您可以通過在Active Directory用戶& computers - > properties - >帳戶中爲該用戶帳戶啓用「不要求Kerberos預身份驗證」選項來阻止此錯誤。

+0

我確實爲用戶帳戶啓用了此屬性正在運行Windows服務。它仍然不起作用。現在系統日誌中的錯誤是:KRB_AP_ERR_MODIFIED。但只要我將用戶切換到「本地系統」,一切正常。 – Manuel 2014-09-08 06:40:38

+0

根據msdn規範,在下列情況下KRB_AP_ERR_MODIFIED可能會出現:1。不匹配DNS名稱解析 - 在使用乘法 IP或/和乘法網絡適配器的NLB環境中,此問題非常普遍。 2.用戶沒有本地NTFS訪問權限。 3.網站使用應用程序池的權限設置較差。 – Frix33 2014-09-08 06:56:06

+0

檢查此kb是否可以幫助您:[link](http://support.microsoft.com/kb/558115) – Frix33 2014-09-08 06:59:32

相關問題