Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JWT认证.NET核心2.2不';更新HttpContext_C#_Asp.net Core_Jwt - Fatal编程技术网

C# JWT认证.NET核心2.2不';更新HttpContext

C# JWT认证.NET核心2.2不';更新HttpContext,c#,asp.net-core,jwt,C#,Asp.net Core,Jwt,我搜索了一些类似的问题,但没有一个对我有帮助。我有以下情况: 在.NET Core 2.2 Startup.cs中,基本JWT身份验证的设置如下: Startup.cs public void配置服务(IServiceCollection服务) { ... var signingConfigurations=新的signingConfigurations(); 服务。添加单例(签名配置); var tokenConfigurations=新的tokenConfigurations(); 新配置F

我搜索了一些类似的问题,但没有一个对我有帮助。我有以下情况:

在.NET Core 2.2 Startup.cs中,基本JWT身份验证的设置如下:

Startup.cs

public void配置服务(IServiceCollection服务)
{
...
var signingConfigurations=新的signingConfigurations();
服务。添加单例(签名配置);
var tokenConfigurations=新的tokenConfigurations();
新配置FromConfigurationOptions(
GetSection(“令牌配置”))
.配置(令牌配置);
services.AddSingleton(令牌配置);
services.AddAuthentication(authOptions=>
{
authOptions.DefaultAuthenticateScheme=JwtBearerDefaults.AuthenticationScheme;
authOptions.DefaultChallengeScheme=JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(bearerOptions=>
{
var paramsValidation=BeareOptions.TokenValidationParameters;
paramsValidation.IssuerSigningKey=签名配置.Key;
paramsValidation.validudience=令牌配置。受众;
paramsValidation.ValidIssuer=tokenConfigurations.Issuer;
//验证接收到的令牌签名
paramsValidation.validateSuersigningKey=true;
//验证接收到的令牌是否仍然有效
paramsValidation.ValidateLifetime=true;
//令牌过期的容忍时间(如果存在时区差异,则使用)
paramsValidation.ClockSkew=TimeSpan.Zero;
});
//激活此项目上的令牌使用情况
services.AddAuthorization(auth=>
{
auth.AddPolicy(“持有人”,新授权PolicyBuilder()
.addAuthenticationScheme(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser().Build());
});
然后,要生成令牌:

LoginController.cs

if(有效需求)
{
索赔实体声明=新的索赔实体(
新GenericEntity(userInDB.UserName,“登录”),
新[]{
新声明(JwtRegisteredClaimNames.Jti,Guid.NewGuid().ToString(“N”)),
新索赔(JwtRegisteredClaimNames.UniqueName、userInDB.UserName),
新声明(“userid”、userInDB.Id、ClaimValueTypes.String),
新声明(“username”、userInDB.username、ClaimValueTypes.String),
}
);
DateTime creationDate=DateTime.Now;
DateTime expirationDate=创建日期+
TimeSpan.FromSeconds(令牌配置.Seconds);
var handler=新的JwtSecurityTokenHandler();
var securityToken=handler.CreateToken(新的SecurityTokenDescriptor
{
Issuer=令牌配置。Issuer,
观众=观众,观众,
SigningCredentials=SigningConfiguration.SigningCredentials,
主题=声明,
NotBefore=创建日期,
Expires=到期日期
});
var-token=handler.WriteToken(securityToken);
还新
{
已验证=真,
created=creationDate.ToString(“yyyy-MM-dd HH:MM:ss”),
expiration=expirationDate.ToString(“yyyy-MM-dd HH:MM:ss”),
accessToken=token,
message=“确定”
};
}
到目前为止,我所做的只是基于演练

到目前为止,还不错。如果我在控制器上添加
[Authorize(“Bearer”)]
,则只有在请求头上有Bearer时才能访问它

但是,当我实现UserSession结构时,要拦截任何请求,遍历HttpContext并填充UserSession对象,它就是不起作用。负责的方法是:

ApplicationBuilderExtensions.cs

公共静态IApplicationBuilder使用会话配置(
此IApplicationBuilder(应用程序生成器)
{
返回builder.UseMiddleware();
}
公共类SessionConfiguration中间件
{
private readonly RequestDelegate\u next;
公共会话配置中间件(RequestDelegate next)
{
_下一个=下一个;
}
公共异步任务InvokeAsync(HttpContext上下文,IUserSession sessao)
{
if(context.User.identifications.Any(id=>id.IsAuthenticated))
{
sessao.UserId=context.User.Claims.FirstOrDefault(x=>x.Type==“UserId”).Value;
sessao.Roles=context.User.Claims.Where(x=>x.Type==”http://schemas.microsoft.com/ws/2008/06/identity/claims/role选择(x=>x.Value).ToList();
sessao.UserName=context.User.Claims.FirstOrDefault(x=>x.Type==“UserName”).Value;
}
//调用管道中的下一个委托/中间件
wait_next.Invoke(上下文);
}
}
但是,当我对这部分代码(在任何请求后都会正确调用)进行解bug时,HttpContext上的
IsAuthenticated
属性总是false,事实上,
上下文中的所有内容都是null或空的。User
我不知道为什么

我是否配置jwt错误?
中间件是否不正确?
我是吗