如何配置Web API安全规则以验证客户端应用生成的OpenID Token?
Web API 项目Azure AD Token校验配置步骤
你使用Azure AD作为身份提供商,API端需要配置JWT Bearer认证来校验传入的访问令牌,具体操作如下:
- 第一步:安装必要NuGet包
首先在API项目中安装Microsoft.AspNetCore.Authentication.JwtBearer包,版本要和你的项目.NET版本匹配。 - 第二步:添加配置项
在API项目的appsettings.json中添加Azure AD相关配置:"AzureAd": { "TenantId": "你的Azure AD租户ID", "Audience": "你的API在Azure AD中注册的客户端ID", "Authority": "https://login.microsoftonline.com/你的Azure AD租户ID" } - 第三步:配置认证服务
如果是.NET 6+的Program.cs,添加如下配置:
如果是.NET Core 3.1及更早版本的Startup.cs,在builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = builder.Configuration["AzureAd:Authority"]; options.Audience = builder.Configuration["AzureAd:Audience"]; options.TokenValidationParameters = new TokenValidationParameters { // 校验签发者,确保是Azure AD签发的令牌 ValidateIssuer = true, ValidIssuer = builder.Configuration["AzureAd:Authority"], // 校验受众,确保令牌是发给当前API的 ValidateAudience = true, ValidAudience = builder.Configuration["AzureAd:Audience"], // 校验令牌有效期 ValidateLifetime = true, // 校验签名密钥,中间件会自动从Azure AD拉取公开签名密钥 ValidateIssuerSigningKey = true }; }); // 注册授权服务 builder.Services.AddAuthorization();ConfigureServices方法中添加:services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = Configuration["AzureAd:Authority"]; options.Audience = Configuration["AzureAd:Audience"]; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = Configuration["AzureAd:Authority"], ValidateAudience = true, ValidAudience = Configuration["AzureAd:Audience"], ValidateLifetime = true, ValidateIssuerSigningKey = true }; }); services.AddAuthorization(); - 第四步:配置中间件管道
注意中间件的顺序不能乱,要先启用认证再启用授权:
.NET 6+ Program.cs:
.NET Core 3.1 Startup.cs的Configure方法:// 放在UseRouting之后,UseAuthorization之前 app.UseAuthentication(); app.UseAuthorization();app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - 第五步:接口加授权校验
在需要保护的控制器或者Action上添加[Authorize]特性即可,接口收到请求时会自动校验请求头中Authorization: Bearer <token>里的令牌有效性,校验失败会返回401状态码。
注意:你当前客户端配置里的
Resource是Graph的URI,如果你要调用自己的Web API,需要修改客户端配置,请求的scope要替换成你自己API暴露的scope,否则拿到的令牌受众是Graph,不是你的API,会校验失败。
内容的提问来源于stack exchange,提问作者S2K
相关产品推荐
相关产品推荐

