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

ASP.NET Bearer Token验证机制及Identity服务DbContext依赖疑问

问题解答

先看你提供的Minimal API代码:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<IdentityDbContext>(options => options.UseInMemoryDatabase("AppDb"));
builder.Services.AddIdentityCore<User>()
    .AddEntityFrameworkStores<IdentityDbContext>()
    .AddApiEndpoints();

builder.Services.AddAuthentication().AddBearerToken(IdentityConstants.BearerScheme);
builder.Services.AddAuthorizationBuilder();

var app = builder.Build();

app.MapIdentityApi<User>();
app.MapGet("/test", (ClaimsPrincipal user) => $"Hello {user.Identity!.Name}").RequireAuthorization();

app.Run();

1. ASP.NET 是如何验证Bearer Token的?

你用的AddBearerToken是ASP.NET Core Identity提供的Bearer令牌方案,它签发的是自包含式安全令牌(本质是加密/签名后的身份凭证)。

验证流程很直接:

  • 登录时,Identity会先查数据库验证你的用户名和密码,通过后生成一个包含用户身份信息(比如用户名、用户ID、权限声明)的令牌,并用服务器的专属密钥对令牌做签名或加密处理。
  • 当你带着令牌访问受保护端点时,ASP.NET会提取令牌,用相同的密钥验证令牌的签名是否合法、是否过期、声明是否有效——整个过程不需要查数据库,因为令牌本身已经包含了足够的身份信息,签名能保证令牌没被篡改。只要令牌没过期、签名合法,就能通过验证。

2. 为什么Identity服务要求注册DbContext,却不从DbContext中验证用户?

Identity要求注册DbContext,是因为它的核心用户管理功能必须依赖数据库:

  • 用户注册时,要把用户名、哈希密码等信息存入数据库;
  • 用户登录时,要从数据库取出用户数据,校验密码是否匹配;
  • 修改密码、删除用户这类操作,也都需要数据库支持。

但令牌验证是独立的流程:一旦令牌签发成功,它就成了用户身份的“有效凭证”,只要令牌本身合法有效,就不需要再去数据库查用户。这就是为什么你重启应用后,InMemoryDb的数据丢了,但之前获取的未过期令牌依然能访问/test端点——验证令牌只看签名和有效期,和数据库状态无关。

简单说:DbContext是给Identity的用户管理环节用的,而令牌验证是身份校验环节,两者是独立的流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:25:00