如何在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
相关产品推荐
相关产品推荐

