C# 为什么我能';在我的自定义JwtBearerHandler中,如果不生成异常,就无法访问HandleAuthenticationAsync?

C# 为什么我能';在我的自定义JwtBearerHandler中,如果不生成异常,就无法访问HandleAuthenticationAsync?,c#,asp.net-core,jwt,asp.net-core-3.0,asp.net-authorization,C#,Asp.net Core,Jwt,Asp.net Core 3.0,Asp.net Authorization,我正试图实现一个定制的JWTBearerHandler来授权API中的一些请求,因为我需要注入一个定制的令牌验证器 因此,我确实基于以下实现实现了AuthenticationHandler: 公共类CustomHandler:AuthenticationHandler { 私有OpenIdConnectConfiguration\u配置; 公共客户处理程序( IOPTIONS监视器选项, iLogger工厂记录器, URL编码器, ISystemClock(系统时钟) :base(选项、记录器、

我正试图实现一个定制的JWTBearerHandler来授权API中的一些请求,因为我需要注入一个定制的令牌验证器

因此,我确实基于以下实现实现了AuthenticationHandler:

公共类CustomHandler:AuthenticationHandler
{
私有OpenIdConnectConfiguration\u配置;
公共客户处理程序(
IOPTIONS监视器选项,
iLogger工厂记录器,
URL编码器,
ISystemClock(系统时钟)
:base(选项、记录器、编码器、时钟){}
/// 
///处理程序对事件调用方法,这些事件在处理发生的特定点上给予应用程序控制。
///如果未提供,则会提供一个默认实例,该实例在调用方法时不会执行任何操作。
/// 
受保护的新JWTBeareEvents事件
{
get=>(JwtBearerEvents)base.Events;
set=>base.Events=value;
}
受保护的覆盖任务CreateEventsAsync()
=>Task.FromResult(新的JWTBeareEvents());
/// 
///在“授权”标头中搜索“承载”令牌。如果找到“承载”令牌,将使用选项中的集合对其进行验证。
/// 
/// 
受保护的重写异步任务handleAuthenticateAync()
{
字符串标记=null;
尝试
{
//让应用程序有机会从其他位置查找、调整或拒绝令牌
var messageReceivedContext=新的messageReceivedContext(上下文、方案、选项);
//事件可以设置令牌
等待事件。MessageReceived(messageReceivedContext);
if(messageReceivedContext.Result!=null)
{
返回消息receivedContext.Result;
}
//如果应用程序从其他地方检索到令牌,请使用该令牌。
token=messageReceivedContext.token;
if(string.IsNullOrEmpty(令牌))
{
字符串authorization=Request.Headers[HeaderNames.authorization];
//如果未找到授权标头,则无需进一步处理
if(string.IsNullOrEmpty(授权))
{
返回AuthenticateResult.NoResult();
}
if(authorization.StartsWith(“bearier”,StringComparison.ordinallingorecase))
{
token=authorization.Substring(“Bearer.Length”).Trim();
}
//如果未找到令牌,则不可能进行进一步的工作
if(string.IsNullOrEmpty(令牌))
{
返回AuthenticateResult.NoResult();
}
}
if(_configuration==null&&Options.ConfigurationManager!=null)
{
_configuration=wait Options.ConfigurationManager.GetConfigurationAsync(Context.RequestAborted);
}
var validationParameters=Options.TokenValidationParameters.Clone();
如果(_配置!=null)
{
var issuers=新[]{u configuration.Issuer};
validationParameters.ValidisUsers=validationParameters.ValidisUsers?.Concat(发行人)??发行人;
validationParameters.IsUserSigningKeys=validationParameters.IsUserSigningKeys?.Concat(_configuration.SigningKeys)
??U配置签名键;
}
List validationFailures=null;
SecurityToken validatedToken;
foreach(Options.SecurityTokenValidators中的var验证器)
{
if(validator.CanReadToken(令牌))
{
索赔主体;
尝试
{
主体=validator.ValidateToken(令牌、validationParameters、out validatedToken);
}
捕获(例外情况除外)
{
//TODO:日志
//Logger.TokenValidationFailed(ex);
//刷新配置以查找可能由密钥翻转引起的异常。用户还可以在事件中请求刷新。
如果(Options.RefreshOnIsUserKeyNotFound&&Options.ConfigurationManager!=空
&&ex是SecurityTokenSignatureKeyNotFoundException)
{
Options.ConfigurationManager.RequestRefresh();
}
if(validationFailures==null)
{
validationFailures=新列表(1);
}
validationFailures.Add(ex);
继续;
}
//托多:这里也一样
//Logger.TokenValidationSucceeded();
var tokenValidatedContext=新的tokenValidatedContext(上下文、方案、选项)
{
校长=校长,
SecurityToken=validatedToken
};
等待事件。TokenValidated(tokenValidatedContext);
if(tokenValidatedContext.Result!=null)
{
返回tokenValidatedContext.Result;
}
if(Options.SaveToken)