You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Blazor页面中优雅获取JWT Token的Claim值?

优雅获取JWT自定义Claim值的方案

首先解决你当前的直接问题:@context.User.FindFirst("FirstName")返回的是Claim对象,其默认ToString()格式为类型:值,所以要获取纯值只需访问Value属性:

@context.User.FindFirst("FirstName")?.Value

但要实现类似@context.User.Identity.Name的简洁调用方式,推荐以下两种方案:

方案一:扩展ClaimsPrincipal类(最直接)

创建静态扩展类,给ClaimsPrincipal添加自定义方法,封装Claim查找和值解析逻辑:

public static class ClaimsPrincipalExtensions
{
    // 获取FirstName
    public static string GetFirstName(this ClaimsPrincipal principal)
    {
        return principal.FindFirst("FirstName")?.Value ?? string.Empty;
    }

    // 获取LastName
    public static string GetLastName(this ClaimsPrincipal principal)
    {
        return principal.FindFirst("LastName")?.Value ?? string.Empty;
    }

    // 获取Credits(自动转换为decimal类型)
    public static decimal GetCredits(this ClaimsPrincipal principal)
    {
        if (decimal.TryParse(principal.FindFirst("Credits")?.Value, out var credits))
        {
            return credits;
        }
        return 0; // 无值时返回默认值
    }
}

在Blazor页面中直接调用:

<div>FirstName: @context.User.GetFirstName()</div>
<div>Credits: @context.User.GetCredits()</div>

方案二:强类型UserProfile类(更直观)

创建一个映射用户信息的强类型类,统一处理Claim到实体的转换:

public class UserProfile
{
    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;
    public decimal Credits { get; set; }
    public string UserName { get; set; } = string.Empty;

    // 从ClaimsPrincipal生成UserProfile实例
    public static UserProfile FromClaims(ClaimsPrincipal principal)
    {
        return new UserProfile
        {
            FirstName = principal.FindFirst("FirstName")?.Value ?? string.Empty,
            LastName = principal.FindFirst("LastName")?.Value ?? string.Empty,
            Credits = decimal.TryParse(principal.FindFirst("Credits")?.Value, out var c) ? c : 0,
            UserName = principal.Identity?.Name ?? string.Empty
        };
    }
}

在Blazor页面中使用:

@code {
    private UserProfile CurrentUser { get; set; } = new();

    protected override void OnInitialized()
    {
        CurrentUser = UserProfile.FromClaims(User);
    }
}

<div>FirstName: @CurrentUser.FirstName</div>
<div>LastName: @CurrentUser.LastName</div>
<div>Credits: @CurrentUser.Credits</div>

注意事项

  • 始终添加空值保护:使用?.Value避免NullReferenceException,并提供合理的默认值
  • 对于数值类型的Claim(如Credits),建议在扩展方法或映射类中做类型转换,避免在页面中处理转换逻辑

内容的提问来源于stack exchange,提问作者GluhaiaMuha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:25:32