IDX11008:此方法不支持验证' jwt'使用方法:ValidateToken(String,TokenValidationParameters,out SecurityToken)

时间:2014-10-06 21:48:26

标签: c# wif jwt

这曾经工作......

回到......我有一个自定义securityTokenHandler。我更新到3.02版本,我能够删除自定义处理程序并直接引用JwtSecurityTokenHandler

<securityTokenHandlers>
  <add type="System.IdentityModel.Tokens.JwtSecurityTokenHandler,
             System.IdentityModel.Tokens.Jwt" />
  <securityTokenHandlerConfiguration>
    <certificateValidation certificateValidationMode="PeerTrust" />
  </securityTokenHandlerConfiguration>
</securityTokenHandlers>

这似乎是一种改进。所以我一直在使用它。

现在我更新到4.0.0并收到此错误...

[NotSupportedException: IDX11008: This method is not supported to validate a 'jwt' use the method: ValidateToken(String, TokenValidationParameters, out SecurityToken).]
   System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateToken(SecurityToken token) +46
   System.IdentityModel.Tokens.SecurityTokenHandlerCollection.ValidateToken(SecurityToken token) +73
   System.IdentityModel.Services.TokenReceiver.AuthenticateToken(SecurityToken token, Boolean ensureBearerToken, String endpointUri) +120
   System.IdentityModel.Services.WSFederationAuthenticationModule.SignInWithResponseMessage(HttpRequestBase request) +493
   System.IdentityModel.Services.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +364
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69

查看内容时,ValidateToken()方法已完全弃用。所以...我想知道如何通过web.config中的被动重定向来调用ValidateToken(String, TokenValidationParameters, out SecurityToken)?我是否必须再次将其包装在自定义处理程序中,或者我是否需要做一些不同的事情?

由于

3 个答案:

答案 0 :(得分:3)

是的,有一些重大变化。如果其他人遇到此问题,从Nuget版本4.0.2.202250711开始,您将需要执行类似以下操作:

public class CustomTokenSecurityHandler : System.IdentityModel.Tokens.JwtSecurityTokenHandler
{
    private const string KeyName = "http://somesite.com/url";
    private const string ValidIssuerString = "http://somesite.com/url";

    public override System.Collections.ObjectModel.ReadOnlyCollection<System.Security.Claims.ClaimsIdentity> ValidateToken(SecurityToken token)
    {
        var idConfig = System.IdentityModel.Configuration.SystemIdentityModelSection.Current.IdentityConfigurationElements.GetElement("");

         var validationParameters = new TokenValidationParameters()
        {
            ValidAudience = (idConfig.AudienceUris.Cast<AudienceUriElement>().First()).Value
        };

         // set up valid issuers
         if ((validationParameters.ValidIssuer == null) &&
             (validationParameters.ValidIssuers == null || !validationParameters.ValidIssuers.Any()))
         {
             validationParameters.ValidIssuers = new List<string> { ValidIssuerString };
         }
         // and signing token.
         if (validationParameters.IssuerSigningToken == null)
         {
             var resolver = (NamedKeyIssuerTokenResolver)this.Configuration.IssuerTokenResolver;
             if (resolver.SecurityKeys != null)
             {
                 IList<SecurityKey> skeys;
                 if (resolver.SecurityKeys.TryGetValue(KeyName, out skeys))
                 {
                     var tok = new NamedKeySecurityToken(KeyName, "id", skeys);
                     validationParameters.IssuerSigningToken = tok;
                 }
             }
         }

        var tokenString = (token as JwtSecurityToken);
         ClaimsPrincipal validated = base.ValidateToken(tokenString.RawData, validationParameters, out token);
         var result = new ReadOnlyCollection<ClaimsIdentity>(validated.Identities.ToList());
         return result;
    }


}

与其他答案的关键区别在于

var tokenString = (token as JwtSecurityToken);
ClaimsPrincipal validated = base.ValidateToken(tokenString.RawData, validationParameters, out token);
var result = new ReadOnlyCollection<ClaimsIdentity>(validated.Identities.ToList());

ValidateToken方法现在只接受3个参数,而不是2.您必须提供实际的令牌字符串,验证参数和SecurityToken对象作为参考。

您也可以直接从web.config中的System.Identity配置部分读取填充验证参数(参见上面的代码)。

答案 1 :(得分:0)

我们遇到了同样的问题。我们包装了标准处理程序以支持该方法:

public override ReadOnlyCollection<ClaimsIdentity> ValidateToken( 
                                                      SecurityToken token)
{
   ClaimsPrincipal validated = ValidateToken(token as JwtSecurityToken, 
                                             validationParameters);
   var result = new ReadOnlyCollection<ClaimsIdentity>(
                       validated.Identities.ToList());
   return result;
}

在我们的例子中,我们从配置文件中读取验证参数。 (我们通过覆盖public override void LoadCustomConfiguration(XmlNodeList nodeList)来完成此操作,我们在其中定义了自己的验证参数格式。这样我们就可以将它们置于标准的System.IdentityModel配置中......

答案 2 :(得分:0)

我有同样的问题。我没有创建自定义处理程序,而只是恢复到System.IdentityModel.Tokens.Jwt的3.0.0.0版本,一切都开始工作了。