如何在 .NET Core Entity Framework 中获取授权 header 值

How to get authorization header value in .NET Core Entity Framework

我在后端使用 JWT 令牌,我的问题是当我的方法上方有 [Authorize] 注释时,如何读取授权的值 header。我需要令牌,因为在它的有效负载中保存了一个用户 ID,我需要该 ID 来执行多个操作(当然令牌首先得到验证)。

在我的前端,我添加授权 header 如下:

axios.post(finalurl, {accessToken: localStorage.accessToken}, {headers: {
            'Authorization': `Bearer ${(localStorage.accessToken)}`
        }})

在我的后端:

[Authorize]
[HttpPut("{id}")]
public async Task<ActionResult<UserWithToken>> PutUser(int id, [FromForm] User user)
{
    // ....
}

我知道也可以在 body 中将令牌作为 object 转移,但这会使事情变得更复杂,因为当我使用这种方式时,我总是必须创建继承自 object 的新模型,我想传输并获取额外的令牌属性。

如果您只想获取用户 ID 并将其作为声明存储在令牌中,您可以通过 HttpContext 获取它,如下所示:

HttpContext.User?
    .Claims?
    .FirstOrDefault(c => c.Type == JwtRegisteredClaimNames.Sub)?
    .Value

当然,如果您使用不同的声明类型,您可以将 JwtRegisteredClaimNames.Sub 替换为您的声明名称。

HttpContext.User 是与当前请求关联的用户的 ClaimsPrincipal

试试这个:

public async Task<ActionResult<UserWithToken>> PutUser(int id, [FromForm] User user)
{
var token = string.Empty;
var header = (string)HttpContext.Request.Headers["Authorization"];
if (header != null) token = header.Substring(7);
.....
}

您也可以通过添加一个有效的参数[FromHeader]来尝试以下方法

[Authorize]
[HttpPut("{id}")]
public async Task<ActionResult<UserWithToken>> PutUser(int id, [FromForm] User user, [FromHeader] string authorization)
{
    // ....
}