从WPF Windows应用程序使用具有集成身份验证的WebService

Tr1*_*tan 2 .net windows wpf web-services windows-authentication

我编写了一个使用.net 3.5 WebService的WPF 4.0 Windows应用程序.当托管的Web服务允许匿名连接时,这可以正常工作,但是我们上线时需要消耗的WebService将保存在启用了集成身份验证的网站中.

运行WPF应用程序的人员将登录到与Web服务器位于同一域中的计算机上,并且如果使用启用了NTLM身份验证的Web浏览器进行浏览,则将有权查看WebService(不输入任何身份验证信息).

是否可以将运行应用程序的已登录用户的详细信息传递给WebService?

这是我目前使用的代码:

MyWebService.SearchSoapClient client = new SearchSoapClient();
//From the research I've done I think I need to something with these:
//UserName.PreAuthenticate = true;
//System.Net.CredentialCache.DefaultCredentials;
List<Person> result = client.FuzzySearch("This is my search string").ToList();
Run Code Online (Sandbox Code Playgroud)

任何指针都非常赞赏.

以下是我当前进行通话时收到的错误消息:

HTTP请求未经授权,客户端身份验证方案为"匿名".从服务器收到的身份验证标头是'Negotiate,NTLM,Digest qop ="auth",algorithm = MD5-sess,nonce ="+ Upgraded + v17 {hashremoved}",charset = utf-8,realm ="Digest"' .

Tr1*_*tan 5

事实证明,在我的案例中,这个问题的解决方案非常简单.

在App.Config文件中的WebService绑定配置中,我对此进行了更改:

<security mode="None">
  <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
 <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
Run Code Online (Sandbox Code Playgroud)

对此:

<security mode="TransportCredentialOnly">
 <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
 <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
Run Code Online (Sandbox Code Playgroud)

注意我更改了Mode和clientCredentialType属性.

在Code Behind中,我在调用WebService上的方法之前添加了这一行:

client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
Run Code Online (Sandbox Code Playgroud)