.NET6 ASP.NET Core gRPC服务端如何更优雅地获取JWT Bearer令牌中的Claim值
.NET6 ASP.NET Core gRPC服务端如何更优雅地获取JWT Bearer令牌中的Claim值
嗨,完全懂你现在的困扰——手动从请求头里抽token再反复解析,确实有点多此一举,毕竟认证中间件早就帮你把令牌验证过一遍了对吧?其实ASP.NET Core的gRPC服务里已经把认证后的用户信息贴心地准备好了,根本不用你再重复造轮子!
你要找的claims集合,其实就在ServerCallContext的User属性里,它对应的是ClaimsPrincipal对象,认证通过后中间件已经把所有的claim都填充进去了。直接用它就行,举个例子:
[Authorize("MyPolicy", AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public override Task<MyResp> MyCall(MyReq request, ServerCallContext context) { // 直接从User属性获取指定claim的值 // 如果是标准claim类型,可以用ClaimTypes里的常量,避免硬编码字符串 var userId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; // 如果是自定义的claim类型,直接传对应的类型字符串就行 var customClaimValue = context.User.FindFirst("YourCustomClaimType")?.Value; // 接下来就可以用这些值处理业务逻辑啦 return Task.FromResult(new MyResp()); }
要是你需要频繁获取某个特定的claim,还可以写个扩展方法封装一下,用起来更顺手:
public static class ServerCallContextExtensions { public static string? GetUserId(this ServerCallContext context) { return context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; } public static string? GetCustomClaim(this ServerCallContext context) { return context.User.FindFirst("YourCustomClaimType")?.Value; } }
之后在服务方法里直接这么用就行:
var userId = context.GetUserId(); var customValue = context.GetCustomClaim();
为什么之前没注意到这个属性呢?可能是你一开始把注意力都放在请求头相关的属性上了,其实ServerCallContext.User就是专门用来承载认证后用户身份信息的,完全符合ASP.NET Core的认证流程,比手动解析token高效还不容易出错。
备注:内容来源于stack exchange,提问作者KarloX
相关产品推荐
相关产品推荐

