基本身份验证似乎没有任何安全头(Basic Authentication appears to ha

2019-09-29 03:35发布

我写了一个非常简单的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);

        }

下面是一个使用基本身份验证时,从提琴手截图:

为什么会出现没有在头使用基本身份验证时。 基本身份验证服务似乎按预期方式工作。 这里是响应(有趣的是,似乎有两个请求和两个响应):

Answer 1:

基本身份验证工作的HTTP水平。 一般流程是,客户端请求的资源,那么服务器发出挑战,那么客户端发出与一个新的请求Authorization包含的头。 如果用户名和密码Authorization头被服务器接受,客户通常会再添加后续请求中的头无需通过request - challenge - re-request-with-authorization再次步骤。

如果你正确地拥有一切的设置,你应该会看到提琴手两个请求。

  1. 没有一个请求Authorization报头包括在内。 从服务器对该请求的响应将是401WWW-Authenticate: Basic realm="your realm"头连接。
  2. 然后,你应该看到的第二个请求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>

我用basicHttpBindingTransportCredentialOnlyBasic以无SSL麻烦等地测试此



文章来源: Basic Authentication appears to have no security header