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

Asp.Net Core 2中OAuth Bearer令牌验证方案咨询

用Asp.Net Core官方中间件配合[Authorize]处理OAuth Bearer Token验证

你完全不用手动提取和编写验证逻辑!Asp.Net Core的官方认证中间件已经帮你封装好了所有核心流程,完美适配[Authorize]属性,既省心又可靠。下面一步步给你讲怎么实现:

第一步:安装必要的NuGet包

首先安装JWT Bearer认证的官方包:

Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
# 或者用.NET CLI命令
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

第二步:配置认证服务(Program.cs)

在Program.cs里添加认证服务配置,告诉中间件如何验证你的JWT Token:

var builder = WebApplication.CreateBuilder(args);

// 添加控制器服务
builder.Services.AddControllers();

// 配置JWT Bearer认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            // 启用签名验证(必须开启,防止token被篡改)
            ValidateIssuerSigningKey = true,
            // 签名密钥(要和你的OAuth服务器生成token时用的密钥一致)
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])),
            
            // 验证发行方(可选,限定token只能来自特定授权服务器)
            ValidateIssuer = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            
            // 验证受众(可选,限定token只能用于你的应用)
            ValidateAudience = true,
            ValidAudience = builder.Configuration["Jwt:Audience"],
            
            // 验证token有效期
            ValidateLifetime = true,
            
            // 允许的时钟偏差(处理服务器时间不一致,这里设为0表示严格校验)
            ClockSkew = TimeSpan.Zero
        };
    });

// 添加授权服务
builder.Services.AddAuthorization();

var app = builder.Build();

// 注意顺序:先执行认证,再执行授权
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

第三步:用[Authorize]属性保护接口

现在你只需要在控制器或Action上加上[Authorize]属性,中间件就会自动处理所有验证流程:

[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
    // 这个接口只有携带有效Bearer Token的请求才能访问
    [Authorize]
    [HttpGet("profile")]
    public IActionResult GetUserProfile()
    {
        // 验证通过后,可通过User.Claims获取token里的用户信息
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        var userName = User.FindFirst(ClaimTypes.Name)?.Value;
        
        return Ok(new { UserId = userId, UserName = userName });
    }
}

什么时候需要自定义逻辑?

如果你的需求超出了标准JWT验证(比如检查token里的自定义Claim、验证用户是否处于活跃状态等),不用完全自己写验证,而是通过自定义授权策略扩展:

比如要求用户必须有Admin角色才能访问:

// 在Program.cs里添加自定义策略
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAdminRole", policy =>
        policy.RequireRole("Admin"));
});

// 在控制器里使用
[Authorize(Policy = "RequireAdminRole")]
[HttpGet("admin/dashboard")]
public IActionResult AdminDashboard()
{
    return Ok("Welcome Admin!");
}

如果需要更复杂的逻辑,可以写自定义的AuthorizationHandler,比如检查token里的自定义字段:

// 定义自定义验证要求
public class CustomTokenRequirement : IAuthorizationRequirement { }

// 实现验证逻辑
public class CustomTokenHandler : AuthorizationHandler<CustomTokenRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomTokenRequirement requirement)
    {
        // 从User对象获取token里的自定义Claim
        var customField = context.User.FindFirst("CustomField")?.Value;
        
        if (!string.IsNullOrEmpty(customField) && customField == "ValidValue")
        {
            context.Succeed(requirement);
        }
        
        return Task.CompletedTask;
    }
}

// 在Program.cs注册handler和策略
builder.Services.AddSingleton<IAuthorizationHandler, CustomTokenHandler>();
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("CustomTokenPolicy", policy =>
        policy.Requirements.Add(new CustomTokenRequirement()));
});

// 控制器使用
[Authorize(Policy = "CustomTokenPolicy")]
[HttpGet("custom")]
public IActionResult CustomEndpoint()
{
    return Ok("Custom validation passed!");
}

为什么不建议手动提取和验证?

官方中间件已经帮你处理了所有边缘情况:

  • 自动从Authorization请求头提取Bearer Token
  • 处理token格式错误、过期、签名无效等异常,返回标准的401/403状态码
  • 集成Asp.Net Core的身份系统,让你可以通过User对象直接获取用户信息
  • 支持标准的OAuth 2.0和JWT规范,兼容性更好

所以除非你有非常特殊的需求(比如token不在标准位置),否则完全没必要自己写提取和验证逻辑。

内容的提问来源于stack exchange,提问作者KJSR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:00:16