2

我有一個WCF服務託管在IIS中,啓用了集成的Windows身份驗證並禁用了匿名身份驗證。當我嘗試從ASP.NET調用此服務時,出現以下MessageSecurityException:將Windows身份傳遞給WCF從ASP.NET

「HTTP請求未經授權,客戶端身份驗證方案'Negotiate'。從服務器收到的身份驗證頭是'Negotiate,NTLM ']「

任何想法?

這是我的服務配置:

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="CalculatorServiceBasicHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service name="Service.CalculatorService" 
      behaviorConfiguration="CalculatorServiceBehavior"> 
    <endpoint name="BasicHttpEndpoint" 
       address="" 
       binding="basicHttpBinding" 
       bindingConfiguration="CalculatorServiceBasicHttpBinding" 
       contract="Framework.ICalculatorService"> 
    </endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="CalculatorServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

這是我如何調用該服務:

var basicHttpBinding = new BasicHttpBinding(); 
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; 
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
var factory = new ChannelFactory<Framework.ICalculatorService>(basicHttpBinding, new EndpointAddress("http://localhost/CalculatorService/CalculatorService.svc")); 
factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; 
var proxy = factory.CreateChannel(); 
var emailAddress = proxy.GetMyEmailAddress(); 
((ICommunicationObject)proxy).Close(); 
factory.Close(); 

回答

1

你的WCF配置適用於我,所以最有可能你沒有IIS配置正確爲您的WCF服務(可能還有您的ASP.NET客戶端)。確保託管您的服務的IIS站點按照此TechNet article for IIS 7.中所述進行配置,開箱即用,IIS 7未啓用Windows身份驗證。如果您使用的是IIS 6,那麼您需要搜索以查看它是如何配置用於Windows身份驗證的。

爲您的服務正確設置IIS後,需要配置調用服務的ASP.NET站點。默認情況下,Web站點的ASP.NET AppPool將使用本地計算機帳戶(ApplicationPoolIdentity或可能的NetworkService)。您需要將該帳戶更改爲適當的域帳戶。您還需要確保您的服務允許該域帳戶通過在IIS管理器中添加授權規則或更新TechNet文章中所述的web.config文件服務來訪問它。

+0

謝謝。我在IIS 5.1(運行XP)上本地託管ASP.NET客戶端,並決定將其移動到運行IIS 6的服務器上並工作。應該知道。我認爲這並不重要,但很高興知道它爲什麼不起作用。5.任何想法? – Yaron 2012-01-06 09:56:35

+0

對不起,幾年前從我的短期記憶中已經清除了IIS 5的知識:) – 2012-01-06 11:58:52