.net 核心中调用 wcf 的身份验证方案

Posted

技术标签:

【中文标题】.net 核心中调用 wcf 的身份验证方案【英文标题】:Authentication scheme in .net core calling wcf 【发布时间】:2020-12-07 18:53:32 【问题描述】:

我有一个 .net core 2.1 web api,它通过 windows 身份验证调用 WCF 服务:

appsettings.json

"MyService": 
    "BasicHttpBinding": 
            "Security": 
                "Mode": "TransportCredentialOnly",
                "Transport": 
                    "ClientCredentialType": "Windows"
                
            
        ,
        "UserPrincipalName": "mydomain/myUser"
,

mydomain/myUser - 它是一个有权调用 MyService 和 MyMethod() 的用户

code.cs

        using (var client = new ServiceClient<IMyService>(BasicHttpBinding, new EndpointAddress(new Uri(myServiceUrl), UpnEndpointIdentity)))
        
            var result = client.Proxy.MyMethod();
            return result;
        

当我尝试从我的应用程序调用 wcf 服务时,出现错误:

HTTP 请求未经客户端身份验证方案授权 '谈判'。从服务器收到的身份验证标头是“协商”

我已尝试在 startup.cs 中指明身份验证架构:

services.AddAuthentication(IISDefaults.Negotiate);

但运气不好,异常还是被复制了。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

如果使用windows认证,客户端调用服务器时需要提供windows凭据:

 Service1Client service1Client = new Service1Client();
 service1Client.ClientCredentials.Windows.ClientCredential.UserName = "Administrator";
 service1Client.ClientCredentials.Windows.ClientCredential.Password = "Password";

如果客户端没有提供windows凭据,会报错:

如果问题仍然存在,请随时告诉我。

更新

尝试使用WCF Web Service Reference添加服务引用来调用服务:

 ServiceReference1.Service1Client service1Client = new ServiceReference1.Service1Client();

我给大家介绍一下我的项目,部署在 IIS 中:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.7.2" />
    <httpRuntime targetFramework="4.7.2"/>
  </system.web>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="serviceBehaviour">
                    <serviceMetadata httpGetEnabled="true"  httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <basicHttpBinding>
                <binding name="HttpBinding_IService">
                    <readerQuotas maxDepth="32" maxStringContentLength="1000000" maxArrayLength="163840000" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"/>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <services>
            <service name="WcfService1.Service1" behaviorConfiguration="serviceBehaviour">
                <endpoint address="Service" binding="basicHttpBinding" bindingConfiguration="HttpBinding_IService" contract="WcfService1.IService1" />
            </service>
        </services>
    </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

这是 web.config。

在IIS中,我为WCF添加了两个绑定,一个是http,一个是https,使用https需要证书:

我们还需要关闭匿名认证,开启windows认证:

如果Mode设置为Transport,我们还需要添加htts绑定和证书。

您可以尝试以上步骤重新部署,希望您能成功。

【讨论】:

看起来合乎逻辑,但不幸的是它没有帮助。问题依旧重现client.ClientCredentials.Windows.ClientCredential.UserName = "myUser";client.ClientCredentials.Windows.ClientCredential.Password = "myPassword";client.ClientCredentials.Windows.ClientCredential.Domain = "myDomain"; 是不是因为您提供了错误的 Windows 凭据? 需要提供服务器端windows凭据。 凭证有效,我输入了自己的凭证。不幸的是,我不能提供错误的截图,因为这个问题只能在测试环境中重现(在本地它工作正常)。日志截图:gyazo.com/9a31370146c72adeba5bb6d221cfff97 您尝试使用 WCF Web 服务引用添加服务引用来调用服务。

以上是关于.net 核心中调用 wcf 的身份验证方案的主要内容,如果未能解决你的问题,请参考以下文章

完整 .NET 和 .NET Core 之间的 WCF 基本身份验证

无法使用 WCF 调用具有基本身份验证的 Web 服务

iPhone Web 服务通过证书身份验证调用 WCF 服务

如何在 ASP.Net MVC 应用程序中使用来自 WCF 身份验证服务的身份验证 cookie

.Net Core 中的 WCF 替换

如何在 WCF 服务中实现自定义身份验证