.NET Core API自定义授权Action Filter如何校验请求头Authorization?
在现有代码基础上,补全两层分支校验、设置拦截返回结果即可满足需求,不需要额外复杂依赖:
校验逻辑拆解
- 利用已获取的
TryGetValue返回结果判断Authorization请求头是否存在 - 请求头存在时,判断对应取值是否包含
Bearer标识 - 任意校验不通过时,直接给上下文赋值401未授权结果,阻断后续Action执行
完整实现代码
public class CustomAuthFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { bool hasAuthHeader = filterContext.HttpContext.Request.Headers.TryGetValue( key: "Authorization", value: out StringValues authHeaderValues); // 校验1:请求头不存在 if (!hasAuthHeader) { filterContext.Result = new UnauthorizedObjectResult("缺少Authorization请求头"); return; } string authValue = authHeaderValues.FirstOrDefault() ?? string.Empty; // 校验2:请求头值是否包含Bearer if (!authValue.Contains("Bearer", StringComparison.OrdinalIgnoreCase)) { filterContext.Result = new UnauthorizedObjectResult("Authorization头值需包含Bearer标识"); return; } // 校验通过,放行请求 base.OnActionExecuting(filterContext); } }
实际使用注意点
- 校验不通过时必须手动
return终止流程,否则即使设置了Result,后续过滤器与Action逻辑仍会正常执行 - 生产环境不建议用
Contains做宽松匹配,推荐替换为authValue.StartsWith("Bearer ", StringComparison.Ordinal)严格匹配标准Bearer格式(即值结构为Bearer + 空格 + 令牌字符串),避免类似MyFakeBearerToken这类无效值误通过校验 - .NET Core中
Request.Headers返回值为StringValues结构,不要强行转为单string取值,避免同名字段多值场景下的类型转换异常 - 基础格式校验通过后,可直接截取
Bearer前缀后的令牌字符串,追加令牌签名、有效期、权限范围等深度校验逻辑
内容的提问来源于stack exchange,提问作者schwifty
相关产品推荐
相关产品推荐

