将 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 客户端 的相关文章

  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • IIS6 中托管的 WCF 服务在生产中收到 404

    我已经构建了一个简单的 WCF 服务并将其部署到 IIS6 我注意到它可以在我的开发和登台环境中运行 但不能在生产环境中运行 每次我尝试点击服务元数据链接时 都会收到 404 页面 我检查了我能想到的所有 IIS 配置 它们是相同的 所以我
  • IIS 上托管的 WCF 服务无法运行

    我想构建一个公开 basicHTTP 端点和 webHTTP 端点的服务 如果我在运行模式下使用 VS2010 测试以下项目 一切都很好 但我想在 IIS 中托管服务 本地或远程 并通过测试 服务 svc 我将我的网站托管到本地 IIS 中
  • WCF:IsInitiating 到底做了什么?

    在某些地方 我看到 IsInitiating 创建了一个新会话 其他地方说它仅在需要时创建新会话 哪个是对的 为了明确起见 我想确保我可以调用 IService Foo 三次 而无需创建三个会话 第一次通过通道调用 IsInitiating
  • 如何从Windows服务公开restful接口?

    我编写了一个公开restful接口的wcf服务 现在我使用iis作为wcf服务主机 除了暴露其余部分之外 我还需要对我的应用程序执行一些操作 为此 我必须将我的应用程序作为 Windows 服务运行 但是使用iis作为主机不会使我的wcf服
  • 需要 WCF 的完整 DI 示例

    有人有完整且有效的 WCF DI 示例吗 Every http www eggheadcafe com tutorials aspnet b428fb65 08b4 45c8 97cd 47ee1a1eaf41 composing wcf
  • WCF 自定义序列化器

    我正在 WCF 中创建一个返回 JSON 的 Web 服务 但 DataContractJsonSerializer 对某些循环引用犹豫不决 在这种特殊情况下我无法删除这些引用 相反 我想使用 Newtonsoft json 库 在 WCF
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • WCF:如何诊断故障通道?

    我正在为我的实验室进行一项更改 希望能够帮助诊断我们所看到的一些奇怪的通道故障现象 有一个测试应用程序使用 DuplexChannelFactory 连接到几个 Windows 服务 并且由于某种原因 该测试应用程序上的通道似乎出现了很多故
  • WCF 包装代理客户端

    我的项目中有许多在客户端应用程序中使用的 Web 方法 我不想写这样的代码 using ServiceClient sc new ServiceClient Invoke service methods sc Method1 相反 我想写
  • 多线程 C# 应用程序中的惰性单例

    我正在开发一个使用 WCF Web 服务的多线程 C 应用程序 与 Web 服务的连接将有一个特定的超时时间 我们可以定义该超时时间 之后连接将关闭 我希望使用单例类来存储与 Web 服务的连接 我试图获取实例如下 CLazySinglet
  • 如何唯一标识会话 0 中运行的 Internet Explorer 窗口?

    我正在创造WCF web services自动化internet explorer 有多个Web服务调用需要访问同一个实例Internet Explorer 然而 自从WCF服务托管于IIS所有对 Web 服务的调用都在会话 0 中执行 现
  • 在 WCF 中序列化 IDictionary

    我们有一个现有的应用程序 其中一个 DTO 对象的属性类型为IDictionary
  • 没有 ASP.NET/IIS 的 .NET Web 服务?

    我正在实现一个需要公开 Web 服务接口的服务器组件 但应用程序不需要它在 IIS 上与 ASP NET 一起运行 有没有一种直接的方法可以在不使用 ASP NET IIS 的情况下在 NET 中实现 Web 服务 我使用的是 NET 3
  • WCF 服务中无法解释的程序集负载 (IIS 7)

    我正在开发一个新的 WCF Web 服务 该服务将托管在现有的 ASP NET Web 应用程序中 当我尝试运行服务的 svc 文件时 出现异常 无法找到程序集的文件 无法加载文件或程序集 System IdentityModel Vers
  • 通过 https 负载均衡器的 WCF http 服务

    我有一个可以通过 http 端点访问的 WCF Web 服务 现在 该服务应通过 https 与负载均衡器一起发布 客户端是通过 svcutil exe 在 Net 中创建的 但 Java 客户端也需要 WSDL 我的理解是 Web 服务在
  • WCF 未在 IIS 6.0 下运行

    尝试让我的 WCF 服务在 IIS 6 下运行 我已经创建了 svc and aspnet isapi dll映射根据 http msdn microsoft com en us library ms752241 aspx http msd
  • 服务具有零个应用程序(非基础设施)端点

    我最近创建了一个WCF服务 dll 和一个服务主机 exe 我知道我的 WCF 服务工作正常 因为我能够成功地将服务添加到 WcfTestClient 但是 当我从服务主机 exe 使用 WCF 时 我似乎遇到了问题 我可以将对 WCF d
  • 尽管受信任的根 CA,WCF 错误“X.509 证书链构建失败”

    我收到了中提到的错误这个问题 https stackoverflow com questions 4256520 wcf error the x 509 certificate cn localhost chain building fai
  • 如何从c#中的窗口服务获取登录用户和机器名?

    如何在c 中从窗口服务获取登录用户 交互式用户 和机器名 当我尝试使用环境和其他类来登录用户名时 它只从窗口服务返回 NT AUTHORITY SYSTEM 该服务在 SYSTEM 帐户下执行 因此您在Environment班级 机器名称应

随机推荐

  • 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