我试图将Windows凭据传递到需要Windows身份验证的WCF服务,但似乎我的凭据没有进入服务。我的服务没有抛出任何错误,但是当我检查下面的2中的任何一个时它们都是空的。 var user = WindowsIdentity.GetCurrent().User;
var callerUserName = ServiceSecurityContext.Current.WindowsIdentity.User;
这是我的客户端code
ServiceReference1.DispatchServiceClient service = new DispatchServiceClient();
service.ClientCredentials.Windows.ClientCredential = ServiceCredentialsManager.GetNetworkCredentials();
service.ClientCredentials.UserName.UserName= ServiceCredentialsManager.GetNetworkCredentials().UserName;
service.ClientCredentials.UserName.Password = ServiceCredentialsManager.GetNetworkCredentials().Password;
客户端配置 -
<basicHttpBinding>
<binding name="BasicHttpsBinding_IDispatchService">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
<basicHttpsBinding>
<binding name="basicHttpsBindingMax" maxBufferSize="999999999"
maxReceivedMessageSize="999999999">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpsBinding>
</bindings>
服务配置 -
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttpsBinding">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
请注意,要使用Windows身份验证,必须在同一Windows域中运行服务和客户端应用程序。
另请确保客户端中您分配的值不为空。通常,使用Windows身份验证时无法从代码访问密码。
如果使用Windows身份验证对服务客户端进行身份验证,则可能不应手动将凭据传递给服务。身份验证过程应由WCF自动处理,并不仅仅依赖于发送凭据,而是例如它可以使用Kerberos票证。
请看一下客户和服务的一些描述和代码示例:
更新
经过一些研究后,我发现有几个消息来源建议在客户端代码中正确设置凭证可能使WCF能够从域外进行身份验证:
这些文章中建议的代码示例类似,但与您在问题中发布的代码示例略有不同。我没有测试过这些方法,但它们可能无法在所有情况下使用。