ASP.NET Core 6 API使用MSAL验证Azure AD Bearer Token及报错处理
ASP.NET Core 6 API 用MSAL验证Bearer Token及异常解决
核心实现方案
不用自定义[AuthorizeMSAL]特性,也无需调用Graph API验证Token。直接用Microsoft官方的Microsoft.Identity.Web包,配合ASP.NET Core自带的认证中间件就能完成Token校验,同时可以验证租户或ClientID信息。
具体步骤
安装NuGet包
安装Microsoft.Identity.Web(若无需UI支持,仅需此包即可):Install-Package Microsoft.Identity.Web配置Program.cs
在Program.cs中添加认证服务配置,指定租户ID、API的ClientID,同时可开启租户或ClientID的校验逻辑:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 可选:添加自定义策略,校验特定租户或ClientID builder.Services.AddAuthorization(options => { // 校验指定租户ID options.AddPolicy("AllowedTenant", policy => policy.RequireClaim("tid", "你的租户ID")); // 校验指定客户端ID options.AddPolicy("AllowedClient", policy => policy.RequireClaim("azp", "你的ClientID")); });同时在
appsettings.json中配置AzureAd节点:"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的租户ID", "ClientId": "你的API的ClientID", "Audience": "你的API的应用ID URI" }控制器使用
在需要验证的控制器或Action上添加[Authorize]特性,若需校验特定租户或ClientID,直接引用自定义策略即可:// 基础Token验证 [Authorize] [ApiController] [Route("api/[controller]")] public class DemoController : ControllerBase { // ... } // 校验指定租户 [Authorize(Policy = "AllowedTenant")] public IActionResult GetTenantRestrictedData() { // ... }
异常问题解决
异常翻译
提供的scope值
offline_access openid profile无效。客户端凭据流必须使用以/.default为后缀的资源标识符(应用程序ID URI)作为scope值。
问题原因及解决
你在使用客户端凭据流(Client Credentials Flow)时,传入了用户授权流专属的scope(offline_access、openid、profile均为用户身份相关的scope),但客户端凭据流要求scope必须是目标资源的应用ID URI加上/.default后缀。
正确的scope格式示例:
- 目标为你的API:
api://{你的API ClientID}/.default - 目标为Graph API:
https://graph.microsoft.com/.default
在获取Token的代码中替换掉原有scope即可解决该异常。
内容的提问来源于stack exchange,提问作者Rafael Estevão
相关产品推荐
相关产品推荐

