kru*_*uvi 13 .net c# windows silverlight wcf
在调用Web服务时,我收到以下错误:
HTTP请求未经授权使用客户端身份验证方案"NTLM".从服务器收到的身份验证标头是"NTLM".HTTP请求未经授权使用客户端身份验证方案"NTLM".从服务器收到的身份验证标头是"NTLM".
我有一个Silverlight 4应用程序,它在我的IIS(7)上调用WCF Web服务.我的WCF Web服务使用NTLM(Windows身份验证)调用安装在不同Web服务器上的另一个ASMX Web服务.我的服务器和托管ASMX Web服务的服务器都位于同一个域中.
当Silverlight客户端从服务器打开应用程序时,http://localhost/MySiteName一切正常.但是当Silverlight客户端从不同的客户端(不是服务器但仍在同一个域中)打开应用程序时,使用http://MyServerName/MySiteName然后我得到错误.
我的IIS中启用了Windows身份验证.我的IIS中禁用了匿名身份验证.
用于调用我的WCF Web服务的绑定配置是:
<binding name="winAuthBasicHttpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
Run Code Online (Sandbox Code Playgroud)
用于调用ASMX Web服务的绑定配置是:
<binding name="ClNtlmBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
</binding>
Run Code Online (Sandbox Code Playgroud)
Ali*_*tad 18
好的,这是我想到的事情:
my WCF web service calls another ASMX web service, installed on a **different** web serverNtlm到Windows并再次测试.好的,关于模仿的几句话.基本上,一个已知的问题是,您无法使用到一台服务器的模拟令牌传递给另一台服务器.原因似乎是令牌是一种使用用户密码的哈希值,对于生成的机器有效,因此无法从中间服务器使用.
在WCF下可以进行委派(即将模拟从服务器转发到另一个服务器).在这里查看此主题.
问题发布已经很久了,但我在类似的情况下遇到了同样的问题.我有一个控制台应用程序,我正在使用Web服务和我的IIS服务器,其中放置Web服务已启用Windows身份验证(NTLM).
我按照这个链接解决了我的问题.以下是示例代码App.config:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="Service1Soap">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" proxyCredentialType="None"
realm=""/>
<message clientCredentialType="UserName" algorithmSuite="Default"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/servicename/service1.asmx"
binding="basicHttpBinding" bindingConfiguration="ListsSoap"/>
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
我必须将域名、用户名、密码从
client.ClientCredentials.UserName.UserName = 域名 + "\\" + 用户名; client.ClientCredentials.UserName.Password = 密码
到
client.ClientCredentials.Windows.ClientCredential.UserName = 用户名;client.ClientCredentials.Windows.ClientCredential.Password = 密码;client.ClientCredentials.Windows.ClientCredential.Domain = 域;
对我来说,解决方案除了使用“Ntlm”作为凭证类型之外,类似于 Jeroen K 的解决方案。如果我有权限级别,我会在他的帖子中加上,但让我在这里发布我的整个代码,它将支持 Windows 和其他凭据类型,如基本身份验证:
XxxSoapClient xxxClient = new XxxSoapClient();
ApplyCredentials(userName, password, xxxClient.ClientCredentials);
private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials)
{
clientCredentials.UserName.UserName = userName;
clientCredentials.UserName.Password = password;
clientCredentials.Windows.ClientCredential.UserName = userName;
clientCredentials.Windows.ClientCredential.Password = password;
clientCredentials.Windows.AllowNtlm = true;
clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
}
Run Code Online (Sandbox Code Playgroud)