如何在 WCF 客户端中提供用户名和客户端证书(为什么此示例有效)?

2023-12-12

考虑一个 WCF 服务,其目的是让传输层需要客户端证书(客户端证书在 IIS 中设置为“必需”)。同样,消息层也会有用户名认证。

现在我已经看到这个问题了:

禁止 WCF 客户端证书和用户名凭据

我可以在某种程度上理解那里发生的事情,并意识到 WCF 本质上不允许两者兼而有之。我在代码中执行了与上面引用的链接中的海报相同的步骤,并发现了相同的结果...正在传递消息级用户名凭据(在我的例子中是在 SOAP 标头中),但是客户端证书(尽管是在 VS 调试中查看请求客户端时附加)实际上并未由端点处理。

现在是让我感到困惑的部分。我决定对它进行一些破解。我想知道为什么它的工作原理与我想要的完全一样......它通过了 IIS 客户端证书要求,用户名被传递到 WCF 服务并且一切正常。然而,WCF 不允许我仅使用 WCF 配置文件或代码(我可以找到)来完成此操作。为什么?

            // sets up a proxy client based on endpoint config
            // basically just here to get the URL.
            this.InitializeSubmitClient();

            // these get used to create the HttpWebRequest
            string url = this.submitClient.Endpoint.Address.ToString();
            string action = "SubmitCDA";

            // this deserializes an XML file which is the "shell" of SOAP document and inject username/password into SOAP Security node
            XmlDocument soapEnvelopeXml = XMLHelper.CreateSoapDocument(this.txtSubmitCdaXmlFile.Text, this.txtAdAccount.Text, this.txtPassword.Text);
            HttpWebRequest webRequest = XMLHelper.CreateWebRequest(url, action);

            // saves the SOAP XML into the webRequest stream.
            XMLHelper.InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);

            // attach the cert
            if (this.chkSendClientCert.Checked)
            {
                X509Certificate myCert = X509Certificate.CreateFromCertFile(@"C:\temp\CDX-IHAT_DevClientCert.cer");
                webRequest.ClientCertificates.Add(myCert);
            }
            else
            {
                webRequest.ClientCertificates.Clear();
            }

            // begin async call to web request.
            IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

更复杂的是,它所适用的 WCF 服务是 BizTalk 服务。


这就是我最终的做法。

服务器配置:

  <customBinding>
    <binding name="CustomCDARequestEndpointBinding">                    
      <textMessageEncoding messageVersion="Soap11" />
      <security authenticationMode="UserNameOverTransport" />
      <httpsTransport requireClientCertificate="true" />
    </binding>
  </customBinding>

客户端配置:

<system.ServiceModel>
  <bindings>
    <customBindings>
      <binding name="CustomBinding_ITwoWayAsync">
          <security defaultAlgorithmSuite="Default"
            authenticationMode="UserNameOverTransport"
            requireDerivedKeys="true"
            includeTimestamp="true"
            messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
          >
            <localClientSettings detectReplays="false" />
            <localServiceSettings detectReplays="false" />
          </security>
          <textMessageEncoding messageVersion="Soap11" />
          <httpsTransport requireClientCertificate="true" />
      </binding>
    </customBinding>
  </bindings>
  <behaviors>
    <endpointBehaviors>
      <behavior name="ohBehave">
        <clientCredentials useIdentityConfiguration="false">
        <clientCertificate findValue="6D0DBF387484B25A16D0E3E53DBB178A366DA954" storeLocation="CurrentUser"
          x509FindType="FindByThumbprint" />            
        </clientCredentials>          
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <client>
     <endpoint address="https://myservice/CDASubmitService/CDASubmit.svc"
        binding="customBinding" bindingConfiguration="SubmitDev" behaviorConfiguration="ohBehave"
        contract="CDASubmitService.CDASubmit" name="SubmitDev" />
  </client>
</system.serviceModel>

让它发挥作用的关键是<httpsTransport requireClientCertificate="true" />元素和<security authenticationMode="UserNameOverTransport"元素/属性。

此配置允许我完全通过配置文件向 WCF (BizTalk) 服务提交消息,而无需更改实际代码。它仍然允许我通过 WebRequest 提交给它,如上所示。

我必须赞扬这篇文章:

禁止 WCF 客户端证书和用户名凭据

还有这个:

将非 BizTalk WCF 配置转换为 BizTalk WCF 自定义终结点

终于让我走上了正轨。我总是回避 WCF 中的自定义绑定,因为我认为它太过分了,但它们实际上并不是什么疯狂的事情,只是一种提供比开箱即用的更详细配置的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WCF 客户端中提供用户名和客户端证书(为什么此示例有效)? 的相关文章

  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • C++中类成员函数相互调用有什么好处?

    我是 C 新手 我发现下面的编程风格对我来说很有趣 我在这里写了一个简化版本 include
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 在 clang 中向量化函数

    我正在尝试根据此用 clang 对以下函数进行矢量化铿锵参考 http llvm org docs Vectorizers html 它采用字节数组向量并根据以下条件应用掩码this RFC https www rfc editor org
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen

随机推荐

  • Jackson 和 java.sql.Time 序列化/反序列化

    考虑这个属性Hibernate 管理实体 JsonFormat pattern HH mm Column name start time private java sql Time startTime 我发布了一个JSON 对象为 Requ
  • 来自已安装应用程序的 OpenID 身份验证

    我目前正在计划一个新的网络项目 客户端将使用常规 Web 浏览器进行连接 如果是常规支持 Java 的手机 则使用 j2me 客户端进行连接 我真的很想利用 OpenID 身份验证 对于常规网络浏览器来说 事情非常简单 但是 我真的不确定已
  • gcc-4.2 失败,退出状态为 1

    我一直在寻找这个问题的答案 但找不到 所以就在这里 我正在尝试安装统一转换器使用 setup py 文件将其导入 MacOS X Lion Python 2 7 2 python setup py install 然后我得到以下错误代码 r
  • ES6类中的构造函数和原型中的构造函数之间的区别?

    ES6 类和函数原型都有一个contructor 但我想知道它们是一样的吗 让我给出更多解释 因此 我创建了一个 Cat 函数 例如 const Cat function name this name name The Cat has th
  • WPF 数据变化动画

    我正在开发一个列出一些对象的 WPF 网格 如果对象的数据发生变化 我想启动动画 下面列出了 XAML 代码的摘录
  • 在生产环境中使用 PGO(配置文件引导优化)的风险

    我有一个系统 Linux 和 C 执行密集的信号 图像处理操作 我想使用 PGO 来提高我们应用程序的性能 使用 PGO 时我应该注意哪些风险 潜在问题 单元测试 E2E测试是否足以验证PGO没有破坏任何东西 微软有一个系统 它根据使用统计
  • 永久添加到 MAC 上的 DYLD_LIBRARY_PATH 会导致 X11 错误

    我正在使用 Python 2 7 并尝试导入 graph tool 并且我的 libboost thread mt dylib 似乎位于 opt local lib 而不是 usr local lib 中 如果我启动 X11 终端并输入 e
  • 在运行时修改 Spring Security 配置

    我正在使用最新的 Spring Boot Spring Boot Starter Security 来构建简单的代理应用程序 目标是使用单一路由 方法启动应用程序 RequestMapping value api register meth
  • 在文本框控件内添加标签

    我想创建一个继承自 TextBox 的控件 其中有一个标签 其中 粘贴 到文本框的右侧 并且该文本不可由用户编辑 而是由属性设置 如何才能做到这一点 我意识到可能有很多原因导致这种用户体验是一个坏主意 但我必须这样做 改编自汉斯 帕桑特的w
  • 使用“月-年”日期值创建带有时间线的 D3.js 散点图

    我有一个列出日期的数据集 如下所示 var dataset 1 2006 20 3 2009 90 11 2004 50 5 2012 33 4 2008 95 4 2004 12 7 2000 44 5 2006 67 6 2007 21
  • POSIX 相当于 boost::thread::hardware_concurrency [重复]

    这个问题在这里已经有答案了 可能的重复 以编程方式查找机器上的核心数 用于确定系统在不超额订阅的情况下可以运行的最大线程数的 POSIX 或 x86 x86 64 特定系统调用是什么 谢谢 它使用 C 兼容的结构 那么为什么不直接使用实际的
  • Magento 模块在本地主机上运行良好,但在实时服务器上运行不佳

    我这里有一个奇怪的案例 I m making a simple magento module right now Some kind of script injection module similar to google analytic
  • 使用 UML 进行 C 编程

    我正在开发一个基于标准规范的嵌入式软件 该软件很大 在开始编码之前我需要设计我的软件 UML是一种面向对象的语言 可能是一个解决方案 但我不知道如何将它用于C软件 有没有任何文档可以帮助使用 UML 进行 C 编程 或者还有其他的c软件设计
  • 使用 cookie 保留整个网站的样式表偏好

    我有一个简单的 JavaScript 函数 它允许我在网站的每个页面中的不同样式表之间进行交换 目前 我的网站上没有实施任何 cookie 因此每当我进入新页面时 都会加载默认样式表 如果用户想要使用备用样式表 他们将被迫再次交换 我想通过
  • ios 中键盘显示方向错误

    我有一个viewcontroller在支持横向和纵向方向的应用程序中 单击按钮后 会出现一个弹出窗口 我应该在其中输入名称 在纵向模式下一切正常 但是 如果我关闭键盘 向左或向右旋转设备 然后打开弹出窗口 键盘仍会以纵向模式打开 I ve
  • 在c#中读取原始图像文件

    如何在未安装编解码器的情况下解码 打开 CR2 或 NEF 和 ARW 等原始图像文件 例如 lightroom 打开原始文件 我的代码如下所示 if fe CR2 fe NEF fe ARW BitmapDecoder bmpDec Bi
  • Xamarin MonoAndroid 设备管理

    我正在使用 Visual Studio 2017 来开发 Android 单视图应用程序 该应用程序应该是一个信息亭应用程序 我的目标是 API 21 在 Visual Studio AVD 设备 提供的模拟器上 我遇到的问题是我似乎无法制
  • 在 Joda 中将 UTC 转换为 LocalDateTime?

    DateTime dt new DateTime 2014 09 15T21 20 14 System out println dt System out println dt plusMillis 581042272 toDateTime
  • Android - 将下一个和上一个按钮添加到软键盘,该按钮在我的活动中单击编辑文本时出现

    我需要将 下一个 和 上一个 按钮添加到我的软键盘上 该键盘在单击活动页面中的编辑文本字段时出现 请为我提供有关实现此概念的教程的指导 提前致谢 您可以通过以下方式在 xml 中执行此操作 android imeOptions action
  • 如何在 WCF 客户端中提供用户名和客户端证书(为什么此示例有效)?

    考虑一个 WCF 服务 其目的是让传输层需要客户端证书 客户端证书在 IIS 中设置为 必需 同样 消息层也会有用户名认证 现在我已经看到这个问题了 禁止 WCF 客户端证书和用户名凭据 我可以在某种程度上理解那里发生的事情 并意识到 WC