将 JWT SecurityToken 传递给 WCF 客户端

2023-12-01

我需要根据用户名/密码身份验证生成并向客户端颁发令牌。我尝试了多种方法来解决这个问题,但所有方法都遇到了问题。

我的第一个计划是在我的 WCF 端点上实施 WS-Trust Issue。我找到的示例使用了以下方法:

[OperationContract(Action = "http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue",
                   ReplyAction = "http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue")]
Message IssueToken(Message rstMessage);

但是,4.5 中对 WIF 进行的更改(将其集成到 .NET Framework 本身)破坏了将 Message 转换为 RequestSecurityToken 的示例代码的其余部分。 WSTrustRequestSerializer 似乎可以做到这一点,但它需要 WSTrustSerializationContext,并且关于如何创建或配置此上下文对象的信息很少。

我尝试简单地将我想要用于 SecurityToken 类型的 JWT 序列化为字符串并将其返回给客户端,但看起来将其反序列化为 WCF 可以使用的 SecurityToken 需要我在客户端上发送 JWTSecurityToken 和 Handler ,我想避免的事情。虽然 WS-Trust 绑定似乎以某种方式回避了这一点并生成 GenericXmlSecurityToken,但我似乎无法找到如何自己创建其中之一。

关于如何在 WS-Trust 中序列化/反序列化 RequestSecurityToken 和 RequestSecurityTokenResponse 对象,或者如何在 WS-Trust 框架之外序列化/反序列化令牌,有什么想法吗?或者其他想法?


我所做的是这样的: 我创建了自己的响应消息版本,其中包含创建 GenericXmlSecurityToken 所需的位。这通常是从 WSTrustChannel 返回的内容,因此这似乎是正确的做法。值得庆幸的是,包装 JWT 的 GenericXmlSecurityToken 的大多数参数都是 null;我只需要序列化令牌(在服务中的 JWTSecurityTokenHandler 上使用 WriteToken 进行序列化)以及 validFrom 和 validTo 值。

客户端代码:

XmlElement element = document.CreateElement("wsse", "BinarySecurityToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
element.SetAttribute("ValueType", "urn:ietf:params:oauth:token-type:jwt");
element.SetAttribute("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary");
UTF8Encoding encoding = new UTF8Encoding();
element.InnerText = Convert.ToBase64String(encoding.GetBytes(jwtToken));

GenericXmlSecurityToken token = new GenericXmlSecurityToken(
    element,
    null,
    validFrom,
    validTo,
    null,
    null,
    null);

var binding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.IssuedKeyType = SecurityKeyType.BearerKey;
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Message.IssuedTokenType = "urn:ietf:params:oauth:token-type:jwt";

var factory2 = new ChannelFactory<IService1>(binding, new EndpointAddress("https://localhost:44300/Service1.svc"));
factory2.Credentials.SupportInteractive = false;
factory2.Credentials.UseIdentityConfiguration = true;

var proxy = factory2.CreateChannelWithIssuedToken(token);

var info = proxy.DoWork();

web.config 的相关部分:

绑定:

<ws2007FederationHttpBinding>
  <binding>
    <security mode="TransportWithMessageCredential">
      <message issuedKeyType="BearerKey" establishSecurityContext="false" issuedTokenType="urn:ietf:params:oauth:token-type:jwt"/>
    </security>
  </binding>
</ws2007FederationHttpBinding>

身份模型部分:

<system.identityModel>
  <identityConfiguration>
    <audienceUris>
      <add value="--audienceUri--"/>
    </audienceUris>
    <securityTokenHandlers>
      <add type="--namespace--.CustomJWTSecurityTokenHandler, --my dll--" />
      <securityTokenHandlerConfiguration>
        <certificateValidation certificateValidationMode="PeerTrust"/>
      </securityTokenHandlerConfiguration>
    </securityTokenHandlers>
    <issuerNameRegistry>
      <trustedIssuers>
        <add name="--issuer--"  thumbprint="--thumbprint--"/>
      </trustedIssuers>
    </issuerNameRegistry>
  </identityConfiguration>
</system.identityModel>

以及此问题中的 CustomJWTSecurityTokenHandler (我的场景仅需要 validIssuer 部分):如何使用对称密钥配置 Microsoft JWT?

我还没有看到在其他地方使用了issuedTokenType 属性,但我发现它对于让我的代码正常工作至关重要。如果没有它,我会收到此错误:“MessageSecurityException:找不到“Microsoft.IdentityModel.Tokens.JWT.JWTSecurityToken”令牌类型的令牌身份验证器。根据当前安全设置,无法接受该类型的令牌。”

作为一种解决方案,这可能有点过分了,但我认为它最大限度地减少了自定义代码的数量,并将其集中在我觉得更舒服的地方。

感谢user2338856 和leastprivilege 让我顺利完成任务!

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

将 JWT SecurityToken 传递给 WCF 客户端 的相关文章

  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca
  • WCF:配置已知类型

    我想知道如何在 WCF 中配置已知类型 例如 我有一个Person类和一个Employee班级 这Employee类是 的子类Person班级 两个类都标有 DataContract 属性 我不想对类的已知类型进行硬编码 例如将 Servi
  • WCF:Per-Call 和 Per-Session 服务...需要说服 Per-Call 是值得的

    我们目前正在审查 WCF 服务设计 困扰我的一件事是 Per Call 和 Per Session 服务之间的决定 我相信我理解两者背后的概念 但我并没有真正看到按呼叫服务的优势 我知道使用 Per Call 服务的动机是 WCF 服务仅在
  • SOA架构数据访问

    在我的 SOA 架构中 我有几个世界碳基金服务 我的所有服务都需要访问数据库 我应该创建一个专门的 WCF 服务来负责所有数据库访问吗 或者 如果我的每个服务都有自己的数据库访问权限 可以吗 在一个版本中 我在一项服务中只实例化了一个实体层
  • 优雅地终止 WCF 服务 - 完成所有打开的会话并限制新会话

    我有一个我编写的 WCF 服务 它托管在 Windows 服务中 它以 PerSession 模式运行 该服务允许客户端通过该服务远程打开文件 更改文件以及关闭文件 到目前为止一切工作都非常顺利 当 Windows 服务停止时 我希望能够让
  • msmq - 触发器 - 独立可执行调用不起作用

    过去几天我一直在尝试使用 msmq 触发器来调用 exe 文件 它永远不会被调用 这些是我遵循的步骤 创建了一个提及队列路径并检查了查看的触发器 启用 选中 创建了一个不带任何条件的规则 以便每当获得新消息时都会触发触发器 并选择提到独立可
  • 如何使用 MVVM-Light 和 WCF RIA 服务创建可混合项目

    我想使用 MVVM 模式构建我的业务应用程序 我选择 MVVM Light 因为它符合我的需求 在我见过的有关 MVVM Light 的每个示例中 没有人使用 WCF RIA 经典的 MIX10 示例在同一项目中使用服务 而 WCF RIA
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • WCF 客户端因服务中断而挂起

    我有一个相当简单的 WCF 服务 它为一堆智能客户端执行单向文件同步 我注意到 当通话期间出现网络或服务中断时 客户端将无法与服务器通信 直到整个应用程序重新启动 该服务运行于BasicHttpBinding并由 IIS6 一个 svc 页
  • ASP.Net Web API 与 WCF,我的项目中应该选择哪一个

    到目前为止 我已经在网络上阅读了很多关于 WCF 和 ASP Net Web API 之间的差异的文章 不幸的是 我无法清楚地知道什么才能达到我的目的 我读过的大多数文章都强调了这两个 Web 服务的设计观点 但我很困惑什么最适合我的项目
  • WCF - 如何增加消息大小配额

    我有一个 WCF 服务 它将 1000 条记录从数据库返回给客户端 我有一个 ASP NET WCF 客户端 我在 asp net Web 应用程序项目中添加了服务引用来使用 WCF 当我运行客户端应用程序时 我收到以下消息 传入消息的最大
  • 我希望能够使用 lambda 表达式来指定要通过 wcf 服务返回的值范围

    我不知道这是否可能 但这会很酷 问题是这是否可能 但如果可能的话 举一个例子 我不确定您将使用什么方法签名来将 lambda 表达式传递到其中 例如方法IList
  • WCF 和数据契约上的接口

    使用 svcutil 创建 WCF 代理时 是否还可以包含数据协定继承的接口 例如 public class SomeType ISometype public string Name get set public interface IS
  • 测试项目和配置文件

    我的 Visual Studio 2008 解决方案中有这种设置 一个使用库 Lib1 需要 app config 文件中的一些配置条目 的 WCF 服务项目 WCFService 我有一个单元测试项目 MSTest 其中包含与 Lib1
  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • 无法从 Windows 7 上的 Windows 服务启动桌面应用程序

    HI 我在 Windows 7 上有 C WCF Windows 服务 以具有管理员权限的用户身份登录 我正在尝试在服务启动后启动桌面应用程序 我发现的所有讨论都是关于 Windows 工作站和桌面 我创建了一个单独的线程 设置线程工作站和
  • WPF 和 WCF 应用程序的用户身份验证/授权的“最佳实践”是什么?

    假设我有一个 NET 富客户端 WPF 应用程序 它将同时部署在 3 个不同的场景中 客户端和服务器代码在单个进程中运行 客户端代码在 Intranet 计算机上运行 并通过 WCF 与运行应用程序 域 基础设施代码的服务器计算机进行通信
  • 如何为本机启用现有 WCF 服务的 JSONP?

    我有一个现有的服务 如下方法 AspNetCompatibilityRequirements RequirementsMode AspNetCompatibilityRequirementsMode Allowed ServiceBehav
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 使用 WCF 支持“application/x-www-form-urlencoded”发布数据的最佳方式?

    我正在基于 W3C 规范构建 WCF 服务 该规范定义了接受 application x www form urlencoded 发布数据的 RESTful Web 服务端点 默认情况下 WCF 不支持这种类型的消息编码 我发现了许多创建如

随机推荐

  • PhoneGap 启动图片 iOS Apple Store 提交 [重复]

    这个问题在这里已经有答案了 一如既往地提交iTunesConnect of my PhoneGap申请起来比较麻烦 特别是当我尝试使用时 我看到弹出这条新消息Application Loader Your binary is not opt
  • 面向对象编程。从方法内部调用方法

    如何从类内的函数调用类方法 我的代码是 var myExtension init function Call onPageLoad onPageLoad function Do something 我试过了 onPageLoad 来自 in
  • 如何在Vue Material中设置灵活的网格

    我正在尝试构建一个使用 Vue Material 在网格中渲染用户输入的卡片的界面 卡片正确渲染 然而 我希望我的网格能够以消除间隙的方式弯曲 对齐和交错不同尺寸的卡片 如下所示 下面的代码与上面的网格相对应
  • PHP:使用来自 php 的参数调用 javascript 函数

    我正在尝试使用 PHP 变量参数调用 JavaScript 函数 我尝试了两种方法 在 PHP 中使用 echo 中的脚本标签调用 JavaScript 函数 IE 将 PHP 变量值赋给 JavaScript 变量
  • 为什么 Numba 不改进这个递归函数

    我有一个结构非常简单的真 假值数组 the real array has hundreds of thousands of items positions np array True False False False True True
  • 按组计算平均值

    我有一个类似于此的大型数据框 df lt data frame dive factor sample c dive1 dive2 10 replace TRUE speed runif 10 gt df dive speed 1 dive1
  • 安卓兼容包

    尝试使 Fragments 示例在低于 11 SDK 的版本上运行时 出现错误 setListAdapter new ArrayAdapter
  • 从数据绑定 DevExpress CheckedListBoxControl 获取项目索引

    我试图从以下位置找到特定值的索引选中列表框控件 CheckedListBoxControl 有一个 DataSource DisplayMember ValueMember 分别设置为 DataTable 和两列 现在我必须将 Checke
  • 如何找到我当前位置附近的位置?

    我需要一些关于使用 android 如何找到我所在位置附近的医院 学校 餐厅 的想法 怎么可能 一步步 Google place api用于访问附近的anloaction地标 Step 1 进入API控制台获取Place API https
  • 如何在 OSGi 中使用 Apache POI

    我想在 OSGi 中使用 Apache POI 通过流式 OOXML API SXSSF 编写 Excel 工作簿 流媒体 API 自 POI 3 9 起可用 由于最新的 Apache POI 3 11 jar 不是捆绑包 让 POI 在
  • Android Studio:编译时 APK META-INF/DEPENDENCIES 中复制的重复文件

    我使用此链接中的说明从 Eclipse 导出项目并导入到 Android Studio http developer android com sdk installing migrate html 当我构建时 出现错误 Duplicate
  • PHP 从 MySQL 导出到 CSV

    我需要将数据从 MySQL 导出到 CSV 但需要从特定 ID 导出 表包含 ID ParentID 和名称 下面是导出所有记录的代码
  • 对 require 的调用期望正好有 1 个字符串文字参数

    我想根据传递下来的道具来渲染图像 第一个注释掉的 filePath 是源文件 我尝试了几种变体 但它总是给我同样的错误 React 文档并没有真正涵盖在 30 多种不同场景的情况下你会做什么 我可以向该组件添加一个状态并让它包含所有文件变体
  • VideoJS:不适用于 IOS

    我使用了 videojs 它在所有浏览器 包括 IE 和 Android 上运行良好 但它不适用于 IOS 设备 iphone 和 ipad IOS 版本 6 这是我用来将视频添加到页面的代码
  • 实体框架是否支持并行异步查询? [复制]

    这个问题在这里已经有答案了 当我们启动多个异步实体框架查询时会发生什么并行运行它们 它们在物理上是并行执行的吗 它们是由实体框架序列化的吗 这是不支持的吗 它会导致异常吗 public async Task QueryDatabase us
  • 给定尺寸的值范围的组合

    我使用以下代码创建数组的索引列表 但是 我希望索引按 Fortran 顺序运行 即内部循环是更快的变化循环 有没有办法在 python 中实现这一点 目前 我得到的输出是 C 顺序的 np transpose np nonzero np o
  • 延迟 JQuery 效果

    我想在延迟几秒钟后淡出一个元素及其所有子元素 但我还没有找到一种方法来指定效果应在指定的时间延迟后开始 setTimeout function foo fadeOut 5000 5000 是五秒 以毫秒为单位
  • 使用 PHP 将数据从 MySQL 下载到 csv 文件

    如何指定从数据库下载的文件 main php include databaseConnection php result mysql query SELECT FROM participants while row mysql fetch
  • 使用 Angular 登录 Twitter

    我正在尝试使用 angular2 实现 singin 功能 也请阅读官方文档从这里 但是没明白流程是怎么回事 我的问题是 访问第一步 即 outh token 的参数是什么 有没有任何教授流程的工作示例或最佳文章 我已经阅读了很多关于 SO
  • 将 JWT SecurityToken 传递给 WCF 客户端

    我需要根据用户名 密码身份验证生成并向客户端颁发令牌 我尝试了多种方法来解决这个问题 但所有方法都遇到了问题 我的第一个计划是在我的 WCF 端点上实施 WS Trust Issue 我找到的示例使用了以下方法 OperationContr