Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net VS 2008单元测试出现WCF安全错误_.net_Wcf_Unit Testing_Authentication - Fatal编程技术网

.net VS 2008单元测试出现WCF安全错误

.net VS 2008单元测试出现WCF安全错误,.net,wcf,unit-testing,authentication,.net,Wcf,Unit Testing,Authentication,我正在使用WCF服务运行我的第一个Visual Studio 2008单元测试,收到以下错误: 试验方法 UnitTest.ServiceUnitTest.TestMyService 引发异常: System.ServiceModel.Security.MessageSecurityException: HTTP请求未经授权 客户端身份验证方案 “匿名”。身份验证标头 从服务器接收到的信息为 “协商,NTLM”。--> System.Net.WebException:远程 服务器返回错误:(40

我正在使用WCF服务运行我的第一个Visual Studio 2008单元测试,收到以下错误:

试验方法 UnitTest.ServiceUnitTest.TestMyService 引发异常: System.ServiceModel.Security.MessageSecurityException: HTTP请求未经授权 客户端身份验证方案 “匿名”。身份验证标头 从服务器接收到的信息为 “协商,NTLM”。--> System.Net.WebException:远程 服务器返回错误:(401) 未经授权

我还在安全日志中获得以下失败的审核:

登录失败:原因:用户已登录 未被授予请求的登录权限 在此计算机上键入
用户 姓名:(互联网客户账户)
域:
登录类型:3
登录过程:IIS
身份验证包:
微软认证软件包V1\u 0
工作站名称:

我正在Windows XP SP3计算机上的IIS 6.0中托管WCF服务。我已检查WCF服务虚拟目录的“匿名访问”和“集成Windows身份验证”

以下是我的服务配置文件:

<system.serviceModel>
    <services>
        <bindings>
            <basicHttpBinding>
                <binding name="MyBinding">
               <security mode="None" />
           </binding>
            </basicHttpBinding>
            <customBinding>
                <binding name="MyBinding">
               <transactionFlow />
                    <textMessageEncoding />
                    <httpsTransport authenticationScheme="Ntlm"/>
                </binding>
            </customBinding>
            <wsHttpBinding>
                <binding name="MyBinding">
                   <security mode="None" />
               </binding>
            </wsHttpBinding>
        </bindings>
        <service 
            behaviorConfiguration="Service1Behavior"
            name="Service1"
        >
            <endpoint 
                address="" 
                binding="wsHttpBinding"
                bindingConfiguration="MyBinding"
                contract="IService1"
            >
                <identity>
                    <dns value="localhost" />
                   </identity>
            </endpoint>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Service1Behavior">
                <serviceMetadata httpGetEnabled="true" />
                   <serviceDebug includeExceptionDetailInFaults="false" />
               </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

默认身份验证是windows(或NTLM),因此您需要在配置文件中指定不需要身份验证

<system.serviceModel>
  <bindings>
    <wsHttpBinding>
      <binding name="myBinding">
        <security mode="None" />
      </binding>
  </bindings>
</system.serviceModel>
binding元素指定对wsHttpBinding的标准行为的修改


然后端点上的“bindingConfiguration=“myBinding”属性表示该端点应使用我们指定的修改。

当绑定中有securityMode=“None”时,应关闭集成身份验证。

我必须更改以下IIS和WCF服务配置以通过“协商,NTLM”“例外

IIS配置:

--未选中“匿名访问”复选框并选中“集成 中的“Windows身份验证”复选框 服务器的目录安全设置 WCF服务虚拟目录

WCF服务:

--实现了basicHttpBinding并配置了basicSettingBinding 安全设置为 “仅限运输凭证”模式和 TransportClientCredentialType到 “窗口”

以下是我更新的wcf服务配置:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="windowsBasicHttpBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
       </basicHttpBinding>
    </bindings>
    <services>
        <service    
      behaviorConfiguration="CityOfMesa.ApprovalRouting.WCFService.RoutingServiceBehavior"
           name="CityOfMesa.ApprovalRouting.WCFService.RoutingService"
        >
            <endpoint 
                binding="basicHttpBinding" bindingConfiguration="windowsBasicHttpBinding"
                name="basicEndPoint"    
                contract="CityOfMesa.ApprovalRouting.WCFService.IRoutingService" 
            />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior 
                name="CityOfMesa.ApprovalRouting.WCFService.RoutingServiceBehavior"
            >
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>


作为旁注…..有一个GPO设置“NTLM身份验证级别”,它控制身份验证,导致单元测试生成“协商,NTLM”异常

更新到安全模式仍然不起作用…我甚至在服务节点.k中添加了bindingName属性,并尝试启用消息安全性和凭据none。还降低了我对解决方案是否有效的把握还添加了bindingConfiguration属性以添加到endpoint元素当我尝试更新服务引用时,收到以下消息:“未提供servrice证书。请在ServiceCredentials中指定服务证书”我尝试了此操作,并在尝试更新测试项目中的服务引用时收到以下错误:元数据包含无法解析的引用“”。HTTP请求未经客户端身份验证方案“匿名”授权。从serCan接收到的Authentication头可以浏览到WSDL吗?如果禁用集成身份验证并启用匿名身份验证,并且在客户端和服务器上都具有SecurityMode=“None”,则应该可以正常工作。请检查计算机上的本地安全策略,并确保匿名用户未被锁定,无法访问网络。最可能的问题是机器的AD组策略或本地安全策略。我还在web应用程序和控制台应用程序中运行此服务,并收到相同的“远程服务器返回错误:(401)未经授权”对于这两个测试,@alhambraeidos-我不确定您想问的是关于
RoutingService行为的什么问题
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="windowsBasicHttpBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
       </basicHttpBinding>
    </bindings>
    <services>
        <service    
      behaviorConfiguration="CityOfMesa.ApprovalRouting.WCFService.RoutingServiceBehavior"
           name="CityOfMesa.ApprovalRouting.WCFService.RoutingService"
        >
            <endpoint 
                binding="basicHttpBinding" bindingConfiguration="windowsBasicHttpBinding"
                name="basicEndPoint"    
                contract="CityOfMesa.ApprovalRouting.WCFService.IRoutingService" 
            />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior 
                name="CityOfMesa.ApprovalRouting.WCFService.RoutingServiceBehavior"
            >
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>