You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:10:22