如何在WCF和WIF中使用JWT令牌?

米卡·德瑞(MickaëlDerriey)

一般注意事项

我们正在使用IdentityServer3,到目前为止对此感到非常满意。
在MS和Thinktecture OWIN中间件的帮助下,我们已经非常轻松地保护MVC和ASP.NET Web API应用程序。

我们正在工作的客户端仍然有很多SOAP WCF服务,这就是我们遇到的问题。

设置

我不会说谎,我对WCF经验还很远,我只在非常基本的情况下使用过它-了解basicHttpBinding,没有传输或消息安全性。

这是我要实现的目标:

  • 客户端从IdentityServer获取JWT访问令牌
  • 令牌以某种方式最终出现在SOAP消息头中
  • WCF读取并验证令牌
  • WCF根据某些标准检查索赔并执行授权

我无法执行第三步。

服务器设置

  • 我正在使用ws2007FederationHttpBinding带有TransportWithMessageCredential安全模式。消息中包含BearerKey,令牌的类型为urn:ietf:params:oauth:token-type:jwt
  • 该服务使用WIF身份管道,在其中添加JwtSecurityTokenHandlerSystem.IdentityModel.Tokens.JwtNuGet包中的

客户端设置

  • STS发出的JWT令牌包装在BinarySecurityTokenXML元素中,而XML元素本身包装在GenericXmlSecurityElement
  • 该令牌被用作的一个参数CreateChannelWithIssuedTokenChannelFactory

怎么了

该令牌位于SOAP标头中,并传递给JwtSecurityTokenHandler
但是然后抛出一个异常:

System.ServiceModel.Security.MessageSecurityException: Message security verification failed. ---> System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at System.Xml.XmlBufferReader.GetChars(Int32 offset, Int32 length, Char[] chars)
   at System.Xml.XmlBufferReader.GetString(Int32 offset, Int32 length)
   at System.Xml.StringHandle.GetString()
   at System.Xml.XmlBaseReader.ReadEndElement()
   at System.ServiceModel.Security.ReceiveSecurityHeader.ExecuteFullPass(XmlDictionaryReader reader)
   at System.ServiceModel.Security.ReceiveSecurityHeader.Process(TimeSpan timeout, ChannelBinding channelBinding, ExtendedProtectionPolicy extendedProtectionPolicy)
   at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessageCore(Message& message, TimeSpan timeout)
   at System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage(Message& message, TimeSpan timeout)
   --- End of inner exception stack trace ---

在JustDecompiling之后,进一步读取SOAP标头中的XML元素时似乎出现了错误。奇怪的是令牌是最后一个元素。整个消息如下所示:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <s:Header>
        <a:Action s:mustUnderstand="1">http://tempuri.org/IService/GetListOfStrings</a:Action>
        <a:MessageID>urn:uuid:5c22d4e2-f9b8-451a-b4ca-a844f41f7231</a:MessageID>
        <ActivityId CorrelationId="554fc496-7c47-4063-9539-d25606f186b0" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">1213dcd7-55b7-4153-8a6d-92e0922f76dd</ActivityId>
        <a:ReplyTo>
            <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
        </a:ReplyTo>
        <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo90CpMlUwLBOmEPkZ5C8fRQAAAAAVWkkf2rJS0qImBv+Yx1recUXdbBLjThDkAMkwfW3/2AACQAA</VsDebuggerCausalityData>
        <a:To s:mustUnderstand="1">https://localhost.fiddler:44322/Service.svc</a:To>
        <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <u:Timestamp u:Id="_0">
                <u:Created>2015-05-21T06:41:45.362Z</u:Created>
                <u:Expires>2015-05-21T06:46:45.362Z</u:Expires>
            </u:Timestamp>
            <wsse:BinarySecurityToken ValueType="urn:ietf:params:oauth:token-type:jwt" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><!-- Removed --></wsse:BinarySecurityToken>
        </o:Security>
    </s:Header>
    <s:Body>
        <GetListOfStrings xmlns="http://tempuri.org/" />
    </s:Body>
</s:Envelope>

看起来好像有什么畸形的东西。从堆栈跟踪中,</o:Security>由于正确地读取和处理了令牌,因此在读取end元素时必须引发异常

复制

我分叉了样本存储库,以便您随意查看。以下是相关的项目:

  • SelfHost (Minimal)sources文件夹中。这是STS
  • Clients解决方案中,WCF服务位于APIs文件夹中
  • Clients解决方案中,WCF客户端是Console Client Credentials With Wcf项目

最好的启动方法是先启动STS,然后Right click -> Debug -> Start new instance在WCF服务上启动,然后在WCF客户端上启动。

提前致谢!

米卡·德瑞(MickaëlDerriey)

我没有解决这个问题,但是IdentityServer的开发人员之一Dominick Baier找到了解决方法。
他认为异常来自WCF中的错误或WCF与Windows的不兼容JwtSecurityTokenHandler由于他认为WCF已完成,因此他不希望有人对此进行检查。

他的解决方案是将JWT令牌包装在SAML令牌中。然后,通过子类化SamlSecurityTokenHandler,将其取回并针对的实例进行验证JwtSecurityTokenHandler

这里是链接:

每个人都玩得开心,现在:-)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 Angular 中使用 JWT 为列表创建令牌

来自分类Dev

如何在Spring OAuth中使用Redis令牌存储获取jwt令牌的解码详细信息

来自分类Dev

如何在php中使用wcf和svc?

来自分类Dev

如何在JWT.io中使用JWE和JWS

来自分类Dev

如何在angularjs中使用拦截器刷新JWT令牌?

来自分类Dev

WIF(使用Thinktecture Identity Server)和双工WCF通道

来自分类Dev

如何在WCF中使用SynchronizationContext

来自分类Dev

如何在Android中使用WCF服务?

来自分类Dev

如何在JWT中使用jti声明

来自分类Dev

NestJS - 如何在 JWT 中使用 RoleGuard?

来自分类Dev

如何将JWT令牌转换为WCF的SAML令牌

来自分类Dev

如何使用RestSharp消耗JWT访问令牌和用户声明

来自分类Dev

如何在NodeJ中使用.pfx证书和密码验证Bearer令牌?

来自分类Dev

如何在Laravel Yajra datable和'。{{csrf_token()}}中使用csrf令牌。不工作

来自分类Dev

如何在WCF会话中添加值并在Client(WinForm)和WCF上下文中使用它?

来自分类Dev

如何在ASP.NET Core 1和VSCode编辑器中使用WCF服务?

来自分类Dev

如何使用Microsoft JWT令牌处理程序来保护基于webHttpBinding的WCF服务

来自分类Dev

如何在带有supertest,passport和JEST的cookie中使用jwt测试身份验证

来自分类Dev

如何在python中使用x和y坐标验证ES384 JWT签名

来自分类Dev

如何在基于类的视图中使用 django REST JWT 授权和身份验证

来自分类Dev

与只使用1个JWT相比,使用刷新令牌和访问令牌如何能更“安全”?

来自分类Dev

在Rest API中使用Facebook维护Express和NodeJS中的JWT的密钥和访问令牌

来自分类Dev

在MVC中使用OAuth承载令牌(JWT)

来自分类Dev

如何存储 JWT 以及如何在 cookie 中使用它

来自分类Dev

JWT 令牌如何在 cookie 中更新?

来自分类Dev

如何在ParsePy中使用parse.com会话令牌?

来自分类Dev

如何在OpenCorporates REST API中使用访问令牌?

来自分类Dev

如何在MVC中使用防伪令牌发出Ajax请求

来自分类Dev

如何在OAuth2中使用“刷新令牌”

Related 相关文章

  1. 1

    如何在 Angular 中使用 JWT 为列表创建令牌

  2. 2

    如何在Spring OAuth中使用Redis令牌存储获取jwt令牌的解码详细信息

  3. 3

    如何在php中使用wcf和svc?

  4. 4

    如何在JWT.io中使用JWE和JWS

  5. 5

    如何在angularjs中使用拦截器刷新JWT令牌?

  6. 6

    WIF(使用Thinktecture Identity Server)和双工WCF通道

  7. 7

    如何在WCF中使用SynchronizationContext

  8. 8

    如何在Android中使用WCF服务?

  9. 9

    如何在JWT中使用jti声明

  10. 10

    NestJS - 如何在 JWT 中使用 RoleGuard?

  11. 11

    如何将JWT令牌转换为WCF的SAML令牌

  12. 12

    如何使用RestSharp消耗JWT访问令牌和用户声明

  13. 13

    如何在NodeJ中使用.pfx证书和密码验证Bearer令牌?

  14. 14

    如何在Laravel Yajra datable和'。{{csrf_token()}}中使用csrf令牌。不工作

  15. 15

    如何在WCF会话中添加值并在Client(WinForm)和WCF上下文中使用它?

  16. 16

    如何在ASP.NET Core 1和VSCode编辑器中使用WCF服务?

  17. 17

    如何使用Microsoft JWT令牌处理程序来保护基于webHttpBinding的WCF服务

  18. 18

    如何在带有supertest,passport和JEST的cookie中使用jwt测试身份验证

  19. 19

    如何在python中使用x和y坐标验证ES384 JWT签名

  20. 20

    如何在基于类的视图中使用 django REST JWT 授权和身份验证

  21. 21

    与只使用1个JWT相比,使用刷新令牌和访问令牌如何能更“安全”?

  22. 22

    在Rest API中使用Facebook维护Express和NodeJS中的JWT的密钥和访问令牌

  23. 23

    在MVC中使用OAuth承载令牌(JWT)

  24. 24

    如何存储 JWT 以及如何在 cookie 中使用它

  25. 25

    JWT 令牌如何在 cookie 中更新?

  26. 26

    如何在ParsePy中使用parse.com会话令牌?

  27. 27

    如何在OpenCorporates REST API中使用访问令牌?

  28. 28

    如何在MVC中使用防伪令牌发出Ajax请求

  29. 29

    如何在OAuth2中使用“刷新令牌”

热门标签

归档