我写了一个非常简单的WFCSerice返回提供的Windows用户名。 下面是客户端的代码:
public Form1()
{
ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client();
s1.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
string str = s1.ReturnWindowsUsername();
InitializeComponent();
}
我可以看到在使用Fidddler HTTP头中的凭据:
我试图做基本身份验证同样的事情(访问支持基本身份验证另一个Web服务)。 下面是客户端的代码:
public Form1()
{
InitializeComponent();
ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client();
s1.ClientCredentials.UserName.UserName = "testuser";
s1.ClientCredentials.UserName.Password = "testpassword";
string str = s1.GetData(1);
}
下面是一个使用基本身份验证时,从提琴手截图:
为什么会出现没有在头使用基本身份验证时。 基本身份验证服务似乎按预期方式工作。 这里是响应(有趣的是,似乎有两个请求和两个响应):
基本身份验证工作的HTTP
水平。 一般流程是,客户端请求的资源,那么服务器发出挑战,那么客户端发出与一个新的请求Authorization
包含的头。 如果用户名和密码Authorization
头被服务器接受,客户通常会再添加后续请求中的头无需通过request - challenge - re-request-with-authorization
再次步骤。
如果你正确地拥有一切的设置,你应该会看到提琴手两个请求。
- 没有一个请求
Authorization
报头包括在内。 从服务器对该请求的响应将是401
与WWW-Authenticate: Basic realm="your realm"
头连接。 - 然后,你应该看到的第二个请求
Authorization
头已经从客户端发送。
下面是从我的环境样本:
如果您没有看到401
从服务器挑战,那么基本身份验证设置不正确了。
为了供给头业务代理,你需要配置你的客户端绑定使用<transport clientCredentialType="Basic"/>
或者说,这就是我所做的,谁知道WCF与它的无数的配置选项。
编辑 :我用这个在服务端:
<bindings>
<basicHttpBinding>
<binding name="httpTransportCredentialOnlyBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</basicHttpBinding>
</bindings>
在客户端:
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:53156/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="WcfTest_CBT.IService1"
name="BasicHttpBinding_IService1" />
</client>
我用basicHttpBinding
, TransportCredentialOnly
和Basic
以无SSL麻烦等地测试此