【问题标题】:How does User.Claims are added from JWT (access token) in .net core?User.Claims 如何从 .net core 中的 JWT(访问令牌)添加?
【发布时间】:2022-11-09 19:51:09
【问题描述】:

这听起来可能是一个奇怪的问题,但我们的代码中有某种流程,我无法弄清楚发生了什么,需要 .net 社区的帮助

在我们的 startup.cs 中,我们有以下添加身份验证的代码:

public override void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication()
        .AddJwtBearer()
        .AddCookie("Cookie");
}   

当有人调用服务(使用 rest API 调用)时,他必须在 Authorization 标头中提供有效的 AccessToken。

现在,我们有一个 Filter 类,它检查当访问控制器中的给定方法时,用户是否拥有该方法所需的正确声明

这是过滤器类:

namespace Authorization
{
    public class ClaimRequirementFilter : IAuthorizationFilter
    {
        private readonly Claim _claim;

        public ClaimRequirementFilter(Claim claim)
        {
            _claim = claim;
        }

        public void OnAuthorization(AuthorizationFilterContext context)
        {

            var hasClaim = context.HttpContext.User.Claims.Any(c =>
                                    string.Equals(c.Type, _claim.Type, StringComparison.OrdinalIgnoreCase)
                                    && string.Equals(c.Value, _claim.Value, StringComparison.OrdinalIgnoreCase));
            if (!hasClaim)
            {
                context.Result = new UnauthorizedResult();
            }
        }
    }
}

而我们使用它的方式是这样的:

[HttpGet]
[ActionName("GetUsers")]
[ClaimRequirement("api_access", "users.read")]
public async Task<IActionResult> GetUsers()
{
    return Ok("Great success!");
}

现在,我想不通的是 HttpContext.User.Claims 如何从 JWT 令牌中获取声明? 我阅读了很多文档和文章,但我无法弄清楚

如果有人有任何数据碎片,这将是一个很大的帮助

谢谢

【问题讨论】:

    标签: .net .net-core claims


    【解决方案1】:

    在此处查看对 JWT 令牌的介绍: https://jwt.io/introduction

    声明是通过对令牌的“有效负载”部分进行解码来提取的。这是通过 .NET Core Framework 中内置的库完成的,因此您看不到详细信息。它正在为您处理。

    通常,JWT 令牌是 Base64Url 编码的。

    如果您想更好地了解 JWT 令牌中的实际内容并手动解码,请使用以下解码器:

    https://jwt.io/

    将您的授权令牌复制并粘贴到那里,您应该会看到它已解码。您可以看到分别解码的标头、有效负载和签名。

    【讨论】:

      【解决方案2】:

      经过一番挖掘,答案是 AddJwtBearer 函数通过从 Authorization 请求标头中提取和验证 JWT 令牌来执行身份验证。

      因此,在来自 Authorization 标头的有效 JWT 验证之后,将填充 User.Claims

      更多信息可以在这里找到: https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.jwtbearerextensions.addjwtbearer?view=aspnetcore-6.0

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 2019-05-11
        • 2019-01-21
        • 2018-10-07
        • 2020-08-12
        • 2018-09-20
        • 2018-01-13
        • 2020-10-28
        • 2021-06-27
        相关资源
        最近更新 更多