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

Blazor Server集成微软/Google OAuth获取AccessToken报错IDW10503

问题分析与解决方案

流程理解的问题

你的OAuth工作流程核心逻辑是对的,但错误在于混用了原生ASP.NET Core OAuth组件与Microsoft.Identity.Web的TokenAcquisition服务:

  • 你使用的AddMicrosoftAccount是ASP.NET Core原生OAuth中间件,它会将获取到的AccessToken存入Cookie;
  • 但TokenAcquisition是Microsoft.Identity.Web库的专属组件,设计用于配合AddMicrosoftIdentityWebApp这类微软身份认证扩展,而非原生的AddMicrosoftAccount。当你调用GetAccessTokenForUserAsync时,它默认使用Cookie认证Scheme,无法识别你配置的Microsoft身份认证Scheme,因此抛出错误。

解决方法

方法一:改用Microsoft.Identity.Web配置微软认证(推荐)

替换原生AddMicrosoftAccount为Microsoft.Identity.Web的扩展方法,让TokenAcquisition能正确关联微软认证Scheme:

  1. 确保已安装Microsoft.Identity.Web和Microsoft.Identity.Web.UI NuGet包。
  2. 修改Startup中的认证配置:
services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogle(options =>
{
    options.ClientId = "...";
    options.ClientSecret = "...";
    options.CallbackPath = "/signin-google";
    options.SaveTokens = true;
    options.Events.OnCreatingTicket += new CustomClaimsHelper().AddCustomClaims;
    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.Scope.Add(PeopleServiceService.ScopeConstants.UserinfoProfile);
})
.AddMicrosoftIdentityWebApp(Configuration, Constants.AzureAd) // 替换原AddMicrosoftAccount
    .EnableTokenAcquisitionToCallDownstreamApi(new string[] { "User.Read" })
    .AddInMemoryTokenCaches();

// 移除单独的services.AddTokenAcquisition();
  1. 此时调用_tokenAcquisition.GetAccessTokenForUserAsync(new string[]{"User.Read"});即可正常获取AccessToken,因为TokenAcquisition已和微软认证Scheme绑定。

方法二:保留原生AddMicrosoftAccount,直接从Cookie获取Token

如果不想改用Microsoft.IdentityWeb,可以直接从HttpContext中读取原生OAuth中间件存储的AccessToken:

  1. 在需要获取Token的组件中注入IHttpContextAccessor,并先在Startup中注册该服务:services.AddHttpContextAccessor();
  2. 通过以下代码获取AccessToken:
var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync(
    MicrosoftAccountDefaults.AuthenticationScheme, 
    "access_token"
);
  1. 使用该AccessToken调用Microsoft Graph API即可。

补充说明

两种方法中,方法一更适合长期维护,因为Microsoft.IdentityWeb提供了更多针对微软身份认证的特性,比如令牌缓存、刷新令牌自动处理等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:52:49