这曾经工作......
回到......我有一个自定义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)
?我是否必须再次将其包装在自定义处理程序中,或者我是否需要做一些不同的事情?
由于
答案 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版本,一切都开始工作了。