程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心??@H_616_1@ 开发过程中遇到如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心?的解决方法建议,希望对你解决如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心?有所启发或帮助;

我正在将 WCF 客户端从 .Net Framework 迁移到 .Net 核心。我正在创建从 ClIEntBase 派生的客户端并使用联合绑定。

这是在 .Net Framework 中工作的绑定创建代码:

private Binding CreateBinding()
{
   var issuerBinding = new WShttpBinding(Securitymode.Transport);
   issuerBinding.Security.Transport.ClIEntCredentialType = httpClIEntCredentialType.Certificate;

   var binding = new WS2007FederationhttpBinding(WSFederationhttpSecuritymode.TransportWithmessageCredential);
   binding.Security.message.IssuedKeyType = SecurityKeyType.SymmetricKey;
   binding.Security.message.NegotiateserviceCredential = false;
   binding.Security.message.EstablishSecurityContext = false;

   binding.Security.message.IssuerAddress = new EndpointAddress(this.stsAddress);
   binding.Security.message.IssuerBinding = issuerBinding;

   return binding
}

这里是.Net core中对应的代码:

private Binding CreateBinding()
{
   var issuerBinding = new WShttpBinding(Securitymode.Transport);
   issuerBinding.Security.Transport.ClIEntCredentialType = httpClIEntCredentialType.Certificate;

   var endpointAddress = new EndpointAddress(this.stsAddress);
   var tokenParameters = WSTrustTokenParameters.CreateWS2007FederationTokenParameters(issuerBinding,endpointAddress);
   tokenParameters.KeyType = SecurityKeyType.SymmetricKey;

   var binding = new WSFederationhttpBinding(tokenParameters);
   binding.Security.message.NegotiateserviceCredential = false;
   binding.Security.message.EstablishSecurityContext = false;

   return binding;
}

不幸的是,.net 核心版本不起作用 - 调用该服务会抛出“http 请求被禁止使用客户端身份验证方案“匿名”。

结果是对sts的请求失败了。 我创建了一个代理来拦截 http 请求,发现对 sts 服务的调用存在以下差异:

  1. .net 框架请求包含 .net 核心版本中缺少的以下属性:
<trust:KeyWrapAlgorithm>
   http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p
</trust:KeyWrapAlgorithm>
<trust:EncryptWith>
   http://www.w3.org/2001/04/xmlenc#aes256-cbc
</trust:EncryptWith>
<trust:SignWith>
   http://www.w3.org/2000/09/xmldsig#hmac-sha1
</trust:SignWith>
<trust:CanonicalizationAlgorithm>
   http://www.w3.org/2001/10/xml-exc-c14n#
</trust:CanonicalizationAlgorithm>
<trust:EncryptionAlgorithm>
   http://www.w3.org/2001/04/xmlenc#aes256-cbc
</trust:EncryptionAlgorithm>
    trust:BinarySecret
  1. trust:Entropy 元素是不同的。 .net 框架版本包含类型属性 Type="http://docs.oasis-open.org/ws-sx/ws-trust/200512/Nonce",该属性在 .net 核心版本中缺失。根据 WS-Trust 文档,默认值为 SymmetricKey。
  2. .net 核心请求包含 .net 框架版本中缺少的 trust:TokenType 元素
<trust:TokenType>
   http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0
</trust:TokenType>

如何设置适当的绑定以使其在 .net core 中工作?

解决方法@H_616_1@

Core 不支持 Wshttpbinding,wcf 只支持 BasichttpBinding、CustomBinding、NethttpBinding、NetTcpBinding:

如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心?

建议你继续使用.net框架或者修改服务端绑定。

有关核心中 WCF 功能的更多信息,您可以参此link。

,

事实证明,.net core WCF 客户端没有随请求发送证书。 .net core 检查证书是否有私钥,如果没有则跳过。 https://github.com/dotnet/corefx/blob/fe7adb2bf92bba926268c2e9f562b11c84932a07/src/Common/src/System/Net/Security/CertificateHelper.cs#L39-L42

if (!cert.HasPrivateKey)
{
   conTinue;
}

我从 Azure Key Vault 获取证书,默认情况下它会在没有私钥的情况下返回证书。将其更改为包含私钥解决了问题。

我的 .net framework 应用程序使用相同的方法获取证书(因此它也没有私钥),但它能够从安装了证书的本地机器存储中获取私钥。

大佬总结

以上是大佬教程为你收集整理的如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心?全部内容,希望文章能够帮你解决如何将具有联合绑定的 wcf 客户端从 .net 框架迁移到 .net 核心?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:wcf