Asp.net core 将我的JWT连接到.NET Core';s IHttpContextAccessor.User

Asp.net core 将我的JWT连接到.NET Core';s IHttpContextAccessor.User,asp.net-core,.net-core,jwt,.net-core-3.0,asp.net-core-3.0,Asp.net Core,.net Core,Jwt,.net Core 3.0,Asp.net Core 3.0,我有一个JWT,它被发送到一个标题中,标题键为“X-JWT-Assertion” 它来得正好。我可以使用IAuthorizationFilter成功验证它 然后,我将IHttpContextAccessor注入控制器,并检查User属性(aSystem.Security.Claims.ClaimsIdentity)。尽管我的JWT有很多主张,但它没有主张 我的猜测是,我的WSO2服务器正在以非标准头名称发送JWT,因此.NET核心代码不知道它在那里 我可以手动访问JWT来获取我的声明,但我更愿意

我有一个JWT,它被发送到一个标题中,标题键为“X-JWT-Assertion

它来得正好。我可以使用
IAuthorizationFilter
成功验证它

然后,我将
IHttpContextAccessor
注入控制器,并检查
User
属性(a
System.Security.Claims.ClaimsIdentity
)。尽管我的JWT有很多主张,但它没有主张

我的猜测是,我的WSO2服务器正在以非标准头名称发送JWT,因此.NET核心代码不知道它在那里

我可以手动访问JWT来获取我的声明,但我更愿意使用内置的.NET方法


我是否可以通过某种方式将JWT与
IHttpContextAccessor.User
对象连接?

首先,您无需将
IHttpContextAccessor
注入控制器即可访问该用户<代码>控制器已具有
用户
属性

其次,您需要在
startup.cs
中添加jwt身份验证,然后使用事件更改它从中读取令牌的方式

services.AddAuthentication()
    .AddJwtBearer(configureOptions =>
    {
        configureOptions.Events.OnMessageReceived = context =>
        {
            context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
            return Task.CompletedTask;
        };
    });  

首先,您不需要将
IHttpContextAccessor
注入控制器来访问用户<代码>控制器已具有
用户
属性

其次,您需要在
startup.cs
中添加jwt身份验证,然后使用事件更改它从中读取令牌的方式

services.AddAuthentication()
    .AddJwtBearer(configureOptions =>
    {
        configureOptions.Events.OnMessageReceived = context =>
        {
            context.Token = context.HttpContext.Request.Headers["X-JWT-Assertion"];
            return Task.CompletedTask;
        };
    });  

请发布配置应用程序身份验证和授权的
Startup.cs
代码。使用
IAuthorizationFilter
不会自动将JWT声明映射到
ClaimsPrincipal
声明。另外,ASP.NET Core具有内置的JWT声明映射,这些映射通常需要清除,因为它们没有用处,而且会产生反作用:请发布配置应用程序身份验证和授权的
Startup.cs
代码。使用
IAuthorizationFilter
不会自动将JWT声明映射到
ClaimsPrincipal
声明。另外,ASP.NETCore有内置的JWT声明映射,这些映射通常需要清除,因为它们是无用的,而且会产生反作用:我将接受这个答案。我创建了另一个概述我进一步问题的答案:我将接受这个答案。我创建了另一个,概述了我的进一步问题: