在 WCF customBinding 中接受 UsernameToken 和 BinarySecurityToken

2024-06-24

我正在使用 customBinding 端点构建 WCF Web 服务,但在接受另一方发送给我的 WS-Security 标头时遇到困难。我们都遵循英国国家卫生服务局制定的规范,因此我无法修改这些要求。

基本结构<wsse:Security>根据规范,标题应如下所示:

<wsse:Security>
    <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurityutility-1.0.xsd" wsu:Id="6CCF6A2B-11A6-11DF-86D1-236A99759561" >
        <wsu:Created>2012-06-12T09:00:00Z</wsu:Created>
        <wsu:Expires>2012-06-12T09:15:00Z</wsu:Expires>
    </wsu:Timestamp>
    <wsse:UsernameToken>
        <wsse:Username>SomeUsername</wsse:Username>
    </wsse:UsernameToken>
    <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsssoap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-
200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="30b91ede-35c2-11df-aac9-97f155153931 ">xxx...</wsse:BinarySecurityToken>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#RSA-SHA1" />
            <Reference URI="#6CCF6A2B-11A6-11DF-86D1-236A99759561" />
            <Transforms>
                <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>xxx...</DigestValue>
        </SignedInfo>
        <SignatureValue>xxx...</SignatureValue>
        <KeyInfo>
            <wsse:SecurityTokenReference>
                <wsse:Reference URI="#30b91ede-35c2-11df-aac9-97f155153931 "/>
            </wsse:SecurityTokenReference>
        </KeyInfo>
    </Signature>
</wsse:Security>

在我的网络服务中,我尝试使用以下绑定:

<customBinding>
    <binding name="wsHttpSoap11" >
        <textMessageEncoding messageVersion="Soap11WSAddressingAugust2004" />
        <security authenticationMode="MutualCertificate">
        </security>
        <httpTransport/>
    </binding>
</customBinding>

(我使用 customBinding 的原因是我必须同时支持WS-寻址 and WS-安全 over SOAP 1.1,并听取了建议这个答案 https://stackoverflow.com/a/5418950/483162.)

如果我通过 Fiddler 运行示例请求,我会在 WCF 跟踪中收到以下错误:

找不到令牌验证器 'System.IdentityModel.Tokens.UserNameSecurityToken' 令牌类型。代币 根据当前的安全性,该类型不能被接受 设置。

我相信这是因为它无法验证<UsernameToken>。如果我将绑定安全性更改为:

<security authenticationMode="UserNameForCertificate">

然后我得到这个错误:

找不到令牌验证器 'System.IdentityModel.Tokens.X509SecurityToken' 令牌类型。代币 根据当前的安全设置,无法接受该类型。

我相信这是因为它现在无法验证<BinarySecurityToken>!

因此,问题是:

  1. 我对错误消息原因的假设是否正确 (它在当前配置中只能处理一个令牌)?
  2. 如何将其配置为接受这两个令牌?

Update

感谢@Yaron,我现在添加了一个自定义绑定扩展,并且用户名安全令牌 and X509安全令牌正在验证。

然而,它现在在验证 XML 签名的阶段失败了。 HTTP响应中返回的异常是:

消息安全验证失败。

如果我深入研究服务跟踪查看器中的堆栈跟踪,我会看到:

System.Security.Cryptography.CryptographicException...

签名验证失败。

在 System.IdentityModel.SignedXml.VerifySignature(HashAlgorithm 哈希, AsymmetrySignatureDeformatter 去格式器) 在 System.IdentityModel.SignedXml.StartSignatureVerification(SecurityKey verifyKey)...

谁能帮我弄清楚为什么会发生这种情况?我现在有点迷失了。我尝试使用一些示例代码 http://msdn.microsoft.com/en-us/library/ms229950%28v=vs.90%29.aspx尝试手动验证签名,但它说签名无效。在我返回供应商之前如何确定是否是这样?这是应该起作用的东西吗?我们应该在某个地方共享一些证书吗?


您将需要从代码创建绑定。

        var b = new CustomBinding();
        var sec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement(MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10);
        sec.EndpointSupportingTokenParameters.Signed.Add(new UserNameSecurityTokenParameters());
        sec.MessageSecurityVersion =
            MessageSecurityVersion.
                WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
        sec.IncludeTimestamp = true;
        sec.MessageProtectionOrder = System.ServiceModel.Security.MessageProtectionOrder.EncryptBeforeSign;

        b.Elements.Add(sec);
        b.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
        b.Elements.Add(new HttpTransportBindingElement());

(一些值是估计的,因为我无法通过您的帖子判断您使用的是哪个肥皂版本或是否应用了 ssl)

您可能稍后运行的另一个问题是您需要在 ServiceContract 属性上具有 ProtectionLevel.SignOnly ,但这与此问题无关。

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

在 WCF customBinding 中接受 UsernameToken 和 BinarySecurityToken 的相关文章

  • 将 C# WCF 扩展性代码移至配置文件

    以下代码将 ParameterInspector 添加到端点 ChannelFactory
  • ChannelFactory重用策略

    我一直在读到 ChannelFactory 的创建是昂贵的 除非有技术原因不这样做 否则应该在可能的情况下重用 ChannelFactory 或者通过某种方式缓存它们 或者使用工厂的静态实例 根据您的经验 您发现哪些 ChannelFact
  • 使用标志来识别口语

    在我正在做的网络应用程序中 我需要识别人们所说的语言 我想使用标志来做到这一点 但我有一些问题 例如 如果您说法语 则可以放置法国国旗 但如果您说英语 您可以放置 美国或英国国旗或两者的混合 阿拉伯语选择哪个标志 沙特阿拉伯国旗 阿尔及利亚
  • JavaScript 并行性

    好吧 首先我想说我在互联网开发领域还是个新手 无论如何 我想知道是否可以使用 javascript 并行运行两段代码 我真正需要的是调用远程服务器中的两个方法 我为两者传递了一个回调函数 该函数将在我想要的数据准备好后立即执行 由于运行这些
  • Java WebServiceException:JBoss 未定义端口类型

    我是 JBoss Web 服务的新手 客户端正在连接到基于 EJB3 的 Web 服务 使用 JAX WS 的 JBoss AS 5 和 JDK 6 我遇到了以下异常 Exception in thread main javax xml w
  • WCF 服务 - 启动需要额外时间

    我发现 WCF 服务将需要 8 10 秒来加载第一个命中 之后将需要不到一秒钟的时间 有什么想法吗 可能是由于 NET 的冷启动 您是否考虑过设置IIS 预热模块它在初始请求之前初始化依赖项 来自学习IIS网站 http learn iis
  • 我们可以将工作流服务托管为 Windows 服务吗?

    我正在开发一个日志记录应用程序 它要求我有一个作为服务公开的工作流 工作流服务 我们希望将其托管为 Windows 服务 不希望将工作流服务托管为 IIS 中的 svc 文件 将其作为 Windows 服务的另一个原因是能够通过命名管道与服
  • 如何在 Xamarin.Forms 项目中使用 .netstandard 中的 WCF 服务?

    我创建了一个 Xamarin Forms 项目 其中 netstandard 2 0 作为 PCL 项目 我正在尝试在该项目中使用 WCF 服务 我已经为 WCF 服务添加了连接服务 当我尝试调用服务中提供的任何方法时 它会给出如下错误 S
  • 有没有一种简单的方法来提供基于 Matlab 的 Web 应用程序或 Web 服务?

    我和一位同事花了几年时间开发一个非常酷的 Matlab 应用程序 MDLcompress 在 Matlab 中 我可以输入 MDLcompress filename txt 它会告诉我有关 filename txt 内容的各种非常酷的内容
  • 对 SSPI 的调用失败 GSSAPI 操作失败并出现错误 - 提供了无效的状态代码(SPNEGO 找不到协商机制)

    我正在构建一个 ASP NET Core WebApi 应用程序 它将成为在 Windows 计算机上工作的 WCF 服务应用程序的客户端 这是我的服务客户端类 public class VITServicesClient Services
  • 从 WCF 发送的响应中删除 utf-8 标识符 (BOM)

    我正在用 c 创建 facebook Rest API 的克隆 我正在使用 facebook PHP sdk 对其进行测试 我遇到的问题是我的网络 Rest 服务发送的响应前面包含 utf 8 Bom 并且 Facebook SDK 无法正
  • WCF 中是否可以在没有无参数构造函数的情况下序列化对象?

    我知道私有无参数构造函数可以工作 但是没有无参数构造函数的对象又如何呢 我想公开来自第三方库的类型 因此我无法控制类型定义 如果有办法的话什么是最简单的 例如 我不知道必须创建子类型 Edit 我正在寻找类似此处所示的定制级别 http m
  • 超出 WCF 最大并发会话数

    我的公司申请遇到了问题 我将总结系统的关键要素 我公司的系统几年来一直在 Windows XP 和 7 Home Pro Basic 机器上运行 它是用 NET 4 0 编写的 基于 WCF 它使用默认的限制值 MaxConcurrentS
  • 为什么 WCF 不能传递字典中的对象?

    在我的 WCF 服务中 我有一个对象QualifiedNumber定义为KnownType and ServiceKnown类型 如果我使用QualifiedNumber通过以下方法 这个不起作用 它抛出一个异常 部分内容如下 元素 htt
  • 分析多层、分布式 Web 应用程序(服务器端)

    我想profile http en wikipedia org wiki Profiling 28computer programming 29来自服务器 PoV 的复杂 Web 应用程序 根据上面的维基百科链接和堆栈溢出profiling
  • WCF 数据服务 (OData) 与 ASP.NET Web API

    我正在设计一个分布式应用程序 其中包含 RESTful 服务和各种客户端 Silverlight iOS Windows Phone 7 等 现在 我正在确定应该使用哪种技术来实现我的服务 WCF 数据服务 OData 或随 ASP NET
  • 运行 mvn install 时如何指定 spring.profiles.active

    在这个使用 Spring 的 Web 应用程序中 我为不同的部署环境创建了多个应用程序属性文件 他们指定不同的数据库连接配置 application dev properties application qa properties appl
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 通过 SSL 进行 SOAP 纯文本密码身份验证的 WCF 配置

    我有一个通过 https 连接到实现 WS Security 的基于 SOAP 的 Web 服务的应用程序 Web 服务是用 Java 编写的 需要纯文本密码以及正确设置的时间戳 经过大量的谷歌搜索和实验后 我无法弄清楚如何配置我的 WCF
  • 如何在 Laravel 5.3 中使用标头参数调用 SOAP wsdl?

    I use artisaninweb laravel soap包来运行 SOAP wsdl 文件 为了解析 WSDL 文件 我需要将其与标头参数一起调用 所以换句话来说 首先我需要设置标头参数 然后将其与此参数一起调用 在我的 larave

随机推荐

  • Spring Boot 和 MongoDB 如何删除 '_class' 列?

    当将数据插入 MongoDB Spring Data 时添加自定义 class 列 在使用 Spring Boot 和 MongoDB 时是否有办法消除 class 列 或者我需要创建一个自定义类型映射器 有什么提示或建议吗 戴夫的回答是正
  • 当我尝试在依赖项中使用 testCompile 时,发生 Gradle“构建脚本错误”

    I m working with Android Studio and in my dependencies for my application I attempting to add a testCompile dependency a
  • 使用 WinAPI 的窗口截图

    如何使用 WinAPI 和 C 制作程序窗口的屏幕截图 要结束了WM PAINT 0x000F 发送到窗口的消息 我想对其进行屏幕截图 wParam HDC处理 但我的图片框中没有屏幕截图 如果我发送一个WM CLOSE消息 一切正常 目标
  • 从私有 GitHub 存储库迁移到公共和私有

    我使用 GitHub 上的私人存储库开发了一个客户项目 我们现在要做的就是开放其中的某一部分 并产生该项目的开源版本 我们的想法是 客户的版本将在此基础上构建 对开源版本所做的任何更改也应适用于私有版本 现在的问题是我不能将当前的 GitH
  • 在自定义 wp_query 循环中按价格订购产品

    我目前有一个非常简单的 wp query 循环来循环我的 WooCommerce 产品 如下所示 args array posts per page gt 1 product cat gt cat post type gt product
  • 输入编码:接受UTF-8

    我需要在 PowerShell 下获取本机应用程序的输出 问题是 输出是用 UTF 8 无 BOM 编码的 PowerShell 无法识别它 只是将那些时髦的 UTF 字符直接转换为 Unicode 我发现 PowerShell 有 Out
  • 如何brew安装特定版本的Node?

    例如 我想安装 7 9 或 7 10 但想避免安装 Node 8 因为webpack node sass破坏错误 当我跑步时brew search node这就是我所看到的 brew搜索节点 leafnode llnode 节点 节点构建
  • 此资源不支持“multipart/form-data”

    我有 WEBAPI2 后端 我尝试从邮递员发送表单数据 但出现这个错误 没有 MediaTypeFormatter 可用于从媒体类型为 multipart form data 的内容中读取类型为 StartWorkingDay 的对象 这是
  • 使用 Node.js 在 Postgres 中更新插入

    我正在尝试使用带有 pg 扩展名的 node js 版本 0 5 4 在 postgres 数据库中进行插入或更新 到目前为止我有这个代码 client query text update users set is active 0 ip
  • 在流行的现代操作系统中,线程本地存储是否存在已知的大小限制?

    当我使用thread local Thread local thread or declspec thread 编译器似乎在线程创建时分配一个线程本地存储并将地址存储在fs or gs在 x86 派生系统中注册 在这种情况下 是否存在 线程
  • 我仍然有 rake/rdoctask 已弃用警告

    我已经进行了捆绑更新 现在运行 rake 命令后仍然有 rake rdoctask 已弃用警告 WARNING require rake rdoctask is deprecated Please use require rdoc task
  • 从 aws elastic beanstalk 中的 .ebextensions 文件夹运行脚本

    我正在尝试从上传战争时运行脚本 所以这里是配置的内容 container commands 01 setup apache command cp ebextensions enable mod deflate conf etc httpd
  • 当显示下一层(html)时,带有超链接的下层(z-index)将被禁用[重复]

    这个问题在这里已经有答案了 可能的重复 单击更高 z index div 下方的链接 https stackoverflow com questions 6740242 click link below a higher z index d
  • 如何链接回 SSRS 中的父报告

    我有一些带有钻取功能的报告 现在被要求向报告添加面包屑样式导航 以便用户可以再次访问父报告 而无需使用小小的 后退 按钮 我想知道是否有一种简单的方法可以做到这一点 目前我在互联网上找不到任何东西 我现在的解决方案是将父报告的参数传递给其子
  • 序列点模糊、未定义的行为?

    今天我遇到了一些表现出不同行为的代码 clang 3 7 git g 4 9 2 和 Visual Studio 2013 经过一些缩减 我想出了这个片段 突出了这个问题 include
  • “一切都是中间件”

    我正在学习 Koa JS 来构建小型 Web 应用程序的服务器端部分 在观看 YouTube 教程和阅读指南时 我看到这样一句话 一切都是中间件 in Koa 我读过关于中间件的维基百科文章 并用谷歌搜索了这个术语 我对什么是中间件有一个粗
  • 防止Matlab舍入输出?

    我运行一个简单的脚本来估计函数的根 一切都很好 算法的每次迭代都会打印出当前的 x 和 f x 但是当脚本完成并将 x 的最终估计设置为函数的输出时 该值将被返回并四舍五入到小数点后 3 位 while k lt maxit k k 1 d
  • 电子邮件表单超过 20 个值

    我有一个包含 20 多个输入字段的表单 PHPmail函数无法工作 因为它只能接受 5 个参数 如何将这些值发送到我的电子邮件地址 to email protected cdn cgi l email protection subject
  • 带有委托构造函数的构造函数初始化列表执行顺序

    我有一个棘手的 C 问题 当您有一个带有委托构造函数的构造函数初始化列表时 列表执行顺序是什么 这里存在两个相互冲突的标准规则 1 构造函数初始化列表不是按列表顺序执行 而是按项目的声明顺序执行 2 构造函数初始化列表中的委托构造函数总是在
  • 在 WCF customBinding 中接受 UsernameToken 和 BinarySecurityToken

    我正在使用 customBinding 端点构建 WCF Web 服务 但在接受另一方发送给我的 WS Security 标头时遇到困难 我们都遵循英国国家卫生服务局制定的规范 因此我无法修改这些要求 基本结构