.NET 8迁移后调用GetAccessTokenForUserAsync遇认证方案错误
解决.NET 8中Azure AD令牌获取的认证方案冲突问题
问题原因
升级到.NET 8并更新Microsoft.Identity.Web后,组件对认证方案的校验逻辑更严格。你调用GetAccessTokenForUserAsync时指定了Cookie认证方案(CookieAuthenticationDefaults.AuthenticationScheme),但令牌获取操作需要关联到OpenID Connect认证方案(而非本地会话的Cookie方案),导致方案不匹配报错。
修复方案
方案1:修改令牌获取代码
移除显式的authenticationScheme参数,让组件自动推断正确的方案:
var accessToken = await m_tokenAcquisition.GetAccessTokenForUserAsync(Configuration["AzureAd:Scopes:0"].Split(" "));
或者直接指定OpenID Connect认证方案:
var accessToken = await m_tokenAcquisition.GetAccessTokenForUserAsync( Configuration["AzureAd:Scopes:0"].Split(" "), authenticationScheme: OpenIdConnectDefaults.AuthenticationScheme);
方案2:调整服务注册配置
在注册AddMicrosoftIdentityWebApp时,显式指定tokenAcquisitionScheme参数,确保TokenAcquisition组件绑定到正确的认证方案:
.AddMicrosoftIdentityWebApp(options => { builder.Configuration.GetSection("AzureAd").Bind(options); options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.SaveTokens = true; options.NonceCookie.SecurePolicy = CookieSecurePolicy.Always; options.CorrelationCookie.SecurePolicy = CookieSecurePolicy.Always; }, null, OpenIdConnectDefaults.AuthenticationScheme, tokenAcquisitionScheme: OpenIdConnectDefaults.AuthenticationScheme)
补充说明
- Cookie认证方案仅用于管理本地用户会话,令牌获取需要依赖OpenID Connect方案关联Azure AD的身份上下文。
- 跨.NET版本升级时,需注意第三方库(如Microsoft.Identity.Web)的配置逻辑变更,避免因参数不兼容导致问题。
内容的提问来源于stack exchange,提问作者Ankur Gupta
相关产品推荐
相关产品推荐

