ASP.NET Core 6自定义AuthorizeAttribute:验证URL参数中的Token
ASP.NET Core 6 自定义URL Token授权实现方案
1. 创建自定义授权需求类
定义一个承载授权规则的需求类,可指定URL中token的参数名:
public class QueryTokenRequirement : IAuthorizationRequirement { public string TokenQueryParamName { get; } public QueryTokenRequirement(string tokenQueryParamName = "token") { TokenQueryParamName = tokenQueryParamName; } }
2. 实现核心授权Handler
这是验证逻辑的核心,负责从URL获取token并完成校验:
public class QueryTokenAuthorizationHandler : AuthorizationHandler<QueryTokenRequirement> { private readonly IHttpContextAccessor _httpContextAccessor; public QueryTokenAuthorizationHandler(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, QueryTokenRequirement requirement) { var httpContext = _httpContextAccessor.HttpContext; if (httpContext == null) { context.Fail(); return Task.CompletedTask; } // 从URL查询参数中提取token var token = httpContext.Request.Query[requirement.TokenQueryParamName].FirstOrDefault(); if (string.IsNullOrEmpty(token)) { context.Fail(); return Task.CompletedTask; } // 替换为你的实际token验证逻辑(比如JWT解析、数据库校验) bool isTokenValid = ValidateToken(token); if (isTokenValid) { // 验证通过后,可添加用户身份信息到上下文 var claims = new List<Claim> { new Claim(ClaimTypes.Name, "ValidUser") // 根据业务设置实际身份信息 }; var identity = new ClaimsIdentity(claims, "QueryTokenAuth"); context.User.AddIdentity(identity); context.Succeed(requirement); } else { context.Fail(); } return Task.CompletedTask; } // 自定义token验证方法,需根据业务逻辑实现 private bool ValidateToken(string token) { // 示例:简单校验,实际项目替换为严谨的验证逻辑 return token == "your_valid_token_here"; } }
3. 创建自定义授权特性
方便标记需要该授权的接口:
public class QueryTokenAuthorizeAttribute : AuthorizeAttribute { public QueryTokenAuthorizeAttribute() { Policy = "QueryTokenPolicy"; } }
4. 注册授权服务到Program.cs
在ASP.NET Core 6的启动文件中配置授权服务:
var builder = WebApplication.CreateBuilder(args); // 注入HttpContextAccessor,用于Handler获取请求上下文 builder.Services.AddHttpContextAccessor(); // 配置授权策略,关联自定义需求 builder.Services.AddAuthorization(options => { options.AddPolicy("QueryTokenPolicy", policy => policy.Requirements.Add(new QueryTokenRequirement())); }); // 注册自定义授权Handler builder.Services.AddScoped<IAuthorizationHandler, QueryTokenAuthorizationHandler>(); builder.Services.AddControllers(); var app = builder.Build(); // 启用授权中间件 app.UseAuthorization(); app.MapControllers(); app.Run();
5. 在接口上使用自定义授权
在需要验证的端点上标记特性即可:
[ApiController] [Route("[controller]")] public class ResourceController : ControllerBase { [HttpGet("view")] [QueryTokenAuthorize] public IActionResult ViewResource() { return Ok("授权通过,已获取资源"); } }
注意事项
- URL参数传递token存在安全风险(会被记录在日志、浏览器历史中),敏感资源建议后续切换到更安全的传递方式
- Token验证逻辑需严谨,比如JWT要验证签名、过期时间、签发方等,避免伪造
- 若需支持多种授权方式(如Bearer Token+URL Token),可修改Handler兼容多种token来源
内容的提问来源于stack exchange,提问作者Pearl
相关产品推荐
相关产品推荐

