.net – 如何用对称密钥配置MIcrosoft JWT?

前端之家收集整理的这篇文章主要介绍了.net – 如何用对称密钥配置MIcrosoft JWT?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试配置我的ASP.NET应用程序来接受使用对称密钥签名的JSON Web令牌(JWT)。 STS无法为此使用证书,因此我们使用对称密钥支持

最后我使用了Microsoft’s JWT Developer Preview.不幸的是,我没有看到任何使用对称键的例子。在用各种工具进行一些挖掘之后,我发现了NamedKeyIssuerTokenResolver,发现我可以配置它使用对称密钥。例如:

  1. <securityTokenHandlers>
  2. <add type="Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler,Microsoft.IdentityModel.Tokens.JWT" />
  3. <securityTokenHandlerConfiguration>
  4. <certificateValidation certificateValidationMode="PeerTrust" />
  5. <issuerTokenResolver
  6. type="Microsoft.IdentityModel.Tokens.JWT.NamedKeyIssuerTokenResolver,Microsoft.IdentityModel.Tokens.JWT">
  7. <securityKey
  8. symmetricKey="+zqf97FD/xyzzyplugh42ploverFeeFieFoeFooxqjE="
  9. name="https://localhost/TestRelyingParty" />
  10. </issuerTokenResolver>
  11. </securityTokenHandlerConfiguration>
  12. </securityTokenHandlers>

我不完全确定我应该在那里使用什么名字。应该是观众Uri,也许是发行人Uri?在任何情况下,我知道如果我不包含一个名字,我的程序启动时会得到异常,因为securityKey元素需要该属性

无论如何,这仍然无法解决问题。在对STS进行身份验证后,我得到以下异常:

  1. [SecurityTokenValidationException: JWT10310: Unable to validate signature. validationParameters.SigningTokenResolver type: 'Microsoft.IdentityModel.Tokens.JWT.NamedKeyIssuerTokenResolver',was unable to resolve key to a token.
  2. The SecurityKeyIdentifier is:
  3. 'SecurityKeyIdentifier
  4. (
  5. IsReadOnly = False,Count = 1,Clause[0] = Microsoft.IdentityModel.Tokens.JWT.NamedKeyIdentifierClause
  6. )
  7. '. validationParameters.SigningToken was null.]
  8. Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler.ValidateSignature(JWTSecurityToken jwt,TokenValidationParameters validationParameters) +2111
  9. Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler.ValidateToken(JWTSecurityToken jwt,TokenValidationParameters validationParameters) +138
  10. Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler.ValidateToken(SecurityToken token) +599
  11. System.IdentityModel.Tokens.SecurityTokenHandlerCollection.ValidateToken(SecurityToken token) +135
  12. System.IdentityModel.Services.TokenReceiver.AuthenticateToken(SecurityToken token,Boolean ensureBearerToken,String endpointUri) +117
  13. System.IdentityModel.Services.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequestBase request) +698
  14. System.IdentityModel.Services.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender,EventArgs args) +123924
  15. System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
  16. System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously) +165

我是否缺少其他配置步骤?我把错误的东西放在名称属性中吗?还是JWT开发者预览中的一个已知错误

2014/02/13更新:

正如@leastprivilege所指出的那样,使用RTM版本的JWT来说,这是一个很容易的事情。我强烈建议你忽略这个,并按照他在http://leastprivilege.com/2013/07/16/identityserver-using-ws-federation-with-jwt-tokens-and-symmetric-signatures/提供的例子。

请注意,以下原始答案是测试版本Microsoft.IdentityModel.Tokens.JWT。升级到发行版本System.IdentityModel.Tokens.Jwt,只需要一点工作。见下文。

主要的问题是JWTSecurityTokenHandler.ValidateToken(token)的方法并未完全填充它传递给JWTSecurityTokenHandler.ValidateToken(token,validationParameters)的TokenValidationParameters。特别是,它不填充SigningToken成员或ValidIssuers(或ValidIssuer)。

有趣的是,我在原来的问题中显示的配置实际上由令牌解析器加载,并且在运行时可用,如下面的代码所示。

但是,我不知道如何在配置文件中指定有效的issuer字符串。我强烈怀疑有一个地方放这个信息,但我还没有弄清楚它在哪里。

解决我的问题是创建一个派生自JWTSecurityTokenHandler的自定义安全令牌处理程序。覆盖ValidateToken(token,validationParameters)使我有机会设置我需要的参数,然后调用基类的ValidateToken方法

  1. public class CustomJwtSecurityTokenHandler: JWTSecurityTokenHandler
  2. {
  3. // Override ValidateSignature so that it gets the SigningToken from the configuration if it doesn't exist in
  4. // the validationParameters object.
  5. private const string KeyName = "https://localhost/TestRelyingParty";
  6. private const string ValidIssuerString = "https://mySTSname/trust";
  7. public override ClaimsPrincipal ValidateToken(JWTSecurityToken jwt,TokenValidationParameters validationParameters)
  8. {
  9. // set up valid issuers
  10. if ((validationParameters.ValidIssuer == null) &&
  11. (validationParameters.ValidIssuers == null || !validationParameters.ValidIssuers.Any()))
  12. {
  13. validationParameters.ValidIssuers = new List<string> {ValidIssuerString};
  14. }
  15. // and signing token.
  16. if (validationParameters.SigningToken == null)
  17. {
  18. var resolver = (NamedKeyIssuerTokenResolver)this.Configuration.IssuerTokenResolver;
  19. if (resolver.SecurityKeys != null)
  20. {
  21. List<SecurityKey> skeys;
  22. if (resolver.SecurityKeys.TryGetValue(KeyName,out skeys))
  23. {
  24. var tok = new NamedKeySecurityToken(KeyName,skeys);
  25. validationParameters.SigningToken = tok;
  26. }
  27. }
  28. }
  29. return base.ValidateToken(jwt,validationParameters);
  30. }
  31. }

在我的Web.config中,我只需要更改安全令牌处理程序:

  1. <securityTokenHandlers>
  2. <!--<add type="Microsoft.IdentityModel.Tokens.JWT.JWTSecurityTokenHandler,Microsoft.IdentityModel.Tokens.JWT" />-->
  3. <!-- replaces the default JWTSecurityTokenHandler -->
  4. <add type="TestRelyingParty.CustomJwtSecurityTokenHandler,TestRelyingParty" />

没有什么可以花三,四天的时间来研究用几十行代码解决的问题。 。 。

新增版本

2013年6月,微软正式发布了其JWT。他们将命名空间更改为System.IdentityModel.Tokens.Jwt。升级后,上述解决方案停止工作。为了使它工作,我不得不添加以下到我的CustomJwtSecurityTokenHandler。这是现有的代码

  1. public override ClaimsPrincipal ValidateToken(JwtSecurityToken jwt)
  2. {
  3. var vparms = new TokenValidationParameters
  4. {
  5. AllowedAudiences = Configuration.AudienceRestriction.AllowedAudienceUris.Select(s => s.ToString())
  6. };
  7. return ValidateToken(jwt,vparms);
  8. }

猜你在找的Windows相关文章