替换Azure Easy Auth后:如何判断JWT认证状态及获取调用者身份
问题1:判断认证(AuthN)是否失败的方法
你当前的配置里,JwtBearer中间件仅会验证Token,但不会主动拦截未通过认证的请求,这就是为什么无论验证成败都会进入授权(AuthZ)过滤器。要实现和Easy Auth一致的“认证失败则不进入AuthZ过滤器”的效果,有两种常用方案:
用
[Authorize]属性标记需认证的资源
给需要认证的控制器或Action添加[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)],这样JwtBearer中间件会自动拦截未通过认证的请求,直接返回401状态码,不会进入后续AuthZ过滤器。在AuthZ过滤器内主动校验认证状态
如果不想依赖[Authorize]属性,可在过滤器中通过以下代码判断认证是否成功:var authResult = await authorizationFilterContext.HttpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme); if (!authResult.Succeeded) { // 认证失败,直接返回401,终止后续逻辑 authorizationFilterContext.Result = new UnauthorizedResult(); return; }也可以直接检查身份认证状态:
if (!authorizationFilterContext.HttpContext.User.Identity.IsAuthenticated) { authorizationFilterContext.Result = new UnauthorizedResult(); return; }
问题2:获取调用者身份的等效实现
Easy Auth中User.Identity.Name对应JWT内的特定Claim字段,JwtBearer中间件默认不会自动映射该值,需手动配置:
全局配置NameClaimType
修改Program.cs中的TokenValidationParameters,添加NameClaimType,指定JWT中代表用户身份的Claim类型(比如Azure AD的JWT里,name是用户名,sub是用户唯一ID,按需选择):opts.TokenValidationParameters = new TokenValidationParameters { // 原有配置保留... NameClaimType = "name", // 也可使用ClaimTypes.Name,对应JWT的"name"字段 RoleClaimType = ClaimTypes.Role // 可选,配置角色Claim映射 };配置完成后,
User.Identity.Name即可正常获取对应值。直接从Claims集合提取
若不想修改全局配置,也可在过滤器中直接从用户Claims里获取目标值:// 获取用户名(对应JWT的"name"字段) string? userName = authorizationFilterContext.HttpContext.User.FindFirstValue("name"); // 获取用户唯一标识(对应JWT的"sub"字段) string? userId = authorizationFilterContext.HttpContext.User.FindFirstValue("sub");
内容的提问来源于stack exchange,提问作者markvgti

