Authentication 认证及;授权-HTTP请求正文中的令牌

Authentication 认证及;授权-HTTP请求正文中的令牌,authentication,.net-core,jwt,asp.net-core-webapi,bearer-token,Authentication,.net Core,Jwt,Asp.net Core Webapi,Bearer Token,我试图创建一个自定义身份验证处理程序,该处理程序将需要HTTP请求主体中的承载JWT,但我不希望创建一个全新的自定义授权。不幸的是,我唯一能做的就是读取HTTP请求主体,从那里获取令牌并将其放入请求的授权头中 有没有其他更有效的方法?我所做的就是找到默认的JwtBearerHandler实现,但是当我进行一些修改时,它无法正确读取主体 Startup.cs: services.AddAuthentication(auth=> { auth.DefaultAuthenticateScheme=Jw

我试图创建一个自定义身份验证处理程序,该处理程序将需要HTTP请求主体中的
承载JWT
,但我不希望创建一个全新的自定义授权。不幸的是,我唯一能做的就是读取HTTP请求主体,从那里获取令牌并将其放入请求的授权头中

有没有其他更有效的方法?我所做的就是找到默认的
JwtBearerHandler
实现,但是当我进行一些修改时,它无法正确读取主体

Startup.cs:

services.AddAuthentication(auth=>
{
auth.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
auth.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(选项=>
{
options.RequireHttpsMetadata=true;
options.SaveToken=true;
options.TokenValidationParameters=新的TokenValidationParameters
{
ValidateSuersigningKey=true,
validateisuer=false,
ValidateAudience=false,
ValidateLifetime=true,
IssuerSigningKey=新对称性安全密钥(密钥),
RequireExpirationTime=true,
ClockSkew=时间跨度从秒(30)
};
options.Events=newjwtbearerevents
{
OnAuthenticationFailed=ctx=>
{
if(ctx.Exception.GetType()==typeof(SecurityTokenExpiredException))
{
添加(“令牌过期”、“true”);
}
返回Task.CompletedTask;
}
};
});
公共类AuthHandler:JwtBearerHandler
{
专用只读IRepositoryEvonaUser\u repositoryUser;
私有OpenIdConnectConfiguration\u配置;
公共AuthHandler(IOptionsMonitor选项,
iLogger工厂记录器,
URL编码器,
IDataProtectionProvider数据保护,
ISystemClock时钟,
IRepositoryUser repositoryUser,
OpenIdConnectConfiguration配置
)
:基本(选项、记录器、编码器、数据保护、时钟)
{
_repositoryUser=repositoryUser;
}
受保护的重写异步任务handleAuthenticateAync()
{
字符串标记=null;
尝试
{
var messageReceivedContext=新的messageReceivedContext(上下文、方案、选项);
等待事件。MessageReceived(messageReceivedContext);
if(messageReceivedContext.Result!=null)
{
返回消息receivedContext.Result;
}
token=messageReceivedContext.token;
if(string.IsNullOrEmpty(令牌))
{
Request.enablebuffer();
使用(var reader=newstreamreader(Request.Body,Encoding.UTF8,true,10,true))
{
var jsonBody=reader.ReadToEnd();
var body=JsonConvert.DeserializeObject(jsonBody);
if(body!=null)
{
token=body.token;
}
Request.Body.Position=0;
}
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(发行人)??发行人;
}
List validationFailures=null;
SecurityToken validatedToken;
foreach(Options.SecurityTokenValidators中的var验证器)
{
if(validator.CanReadToken(令牌))
{
ClaimsPrincipal principal;//它找不到这个
尝试
{
主体=validator.ValidateToken(令牌、validationParameters、out validatedToken);
}
捕获(例外情况除外)
{
如果(Options.RefreshOnIsUserKeyNotFound&&Options.ConfigurationManager!=空
&&ex是SecurityTokenSignatureKeyNotFoundException)
{
Options.ConfigurationManager.RequestRefresh();
}
if(validationFailures==null)
{
validationFailures=新列表(1);
}
validationFailures.Add(ex);
继续;
}
var tokenValidatedContext=新的tokenValidatedContext(上下文、方案、选项)
{
校长=校长,
SecurityToken=validatedToken
};
等待事件。TokenValidated(tokenValidatedContext);
if(tokenValidatedContext.Result!=null)
{
返回tokenValidatedContext.Result;
}
if(Options.SaveToken)
{
tokenValidatedContext.Properties.StoreTokens(新[]
{
新身份验证令牌{Name=“access\u token”,Value=token}
});
}
tokenValidatedContext.Success();
返回tokenValidatedContext.Result;
}