.NET Core 5中MVC管道如何验证AzureAD OIDC并获取用户声明
核心问题定位
你当前使用的AddOpenIdConnect中间件不适用于纯后端API场景:该中间件是为带前端交互的Web应用设计的,用于处理跳转到Azure AD的登录、回调流程,不会自动解析请求头中携带的Bearer令牌,所以你获取到的用户声明始终为空。纯后端API验证OIDC令牌应该使用JWT Bearer认证中间件。
修改步骤
1. 安装依赖包
先安装对应.NET版本的JWT Bearer认证包:
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
2. 调整ConfigureServices配置
替换原有认证配置,示例如下:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 配置Azure AD的元数据地址,单租户场景替换{租户ID}为你的Azure AD租户ID options.Authority = "https://login.microsoftonline.com/{租户ID}/v2.0"; // 配置受众校验,确保令牌是发给你的应用的 options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "https://login.microsoftonline.com/{租户ID}/v2.0", ValidateAudience = true, ValidAudience = azureAdConfig.ClientId, ValidateLifetime = true }; // 可选:添加事件监听方便调试问题 options.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { // 这里可以打断点看认证失败的具体原因,比如令牌过期、签名错误等 return Task.CompletedTask; }, OnTokenValidated = context => { // 令牌校验通过后会触发这里,此时已经可以拿到用户声明 return Task.CompletedTask; } }; });
3. 确认中间件顺序
你当前Configure方法中的中间件顺序是正确的,只要保证UseAuthentication在UseAuthorization之前、路由匹配之后、端点映射之前即可:
Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... 其他配置 比如异常处理、静态文件、路由 app.UseRouting(); // 必须在UseAuthentication之前 app.UseAuthentication(); app.UseAuthorization(); // ... 端点映射 比如UseEndpoints }
4. 请求格式校验
确保客户端调用接口时,请求头携带的Authorization字段格式正确:Authorization: Bearer <你的Azure AD颁发的JWT令牌>
配置完成后,在OnAuthorizationAsync中就可以通过context.HttpContext.User.Claims正常获取用户声明了。
内容的提问来源于stack exchange,提问作者briswill
相关产品推荐
相关产品推荐

