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

ASP Core 2.0中如何获取Azure AD B2C返回的用户访问令牌?

解决Azure B2C在.NET Core 2.0 MVC中获取Access Token为空的问题

我之前做Azure B2C集成的时候也踩过几乎一模一样的坑,咱们一步步拆解来解决:

一、为什么默认拿不到Access Token?

默认情况下,.NET Core的OpenID Connect中间件只会请求id_token(用来完成身份认证),不会主动触发access_token的发放。而且Azure B2C有个硬性要求:必须明确指定目标API的作用域,否则它不知道要给你颁发对应哪个API的访问令牌,自然就返回空了。

二、直接修改ResponseType报错的原因

你把ResponseType改成"id_token code token"后报错,大概率是两个核心问题:

  1. 缺少API作用域配置:没告诉Azure B2C你要访问哪个API,它没法生成有效的access_token。
  2. 响应类型不匹配:.NET Core 2.0的OpenIdConnect中间件对混合流(hybrid flow)的响应类型格式有要求,同时你的B2C用户流/策略可能没开启对应的响应类型支持。

三、具体解决步骤

1. 先确认Azure B2C端的配置

  • 确保你已经在B2C租户里注册了要调用的目标API,并且给你的MVC应用分配了该API的权限(比如常见的user_impersonation权限)。
  • 检查B2C的用户流/自定义策略:
    • 如果是用户流:在用户流的属性设置里,确认「令牌兼容性设置」中允许发放ID令牌和访问令牌。
    • 如果是自定义策略:在RelyingParty部分的<AllowedResponseTypes>里添加token、code、id_token,同时确保OutputClaims包含access_token。

2. 调整.NET Core 2.0的OpenIdConnect配置

在Startup.cs的ConfigureServices方法中,修改AddOpenIdConnect的配置:

services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
    .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));

services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options =>
{
    // 使用枚举值设置混合流响应类型,避免手动写字符串的格式错误
    options.ResponseType = OpenIdConnectResponseType.CodeIdTokenToken;
    
    // 添加目标API的作用域,替换成你自己的API作用域地址
    options.Scope.Add("https://your-b2c-tenant.onmicrosoft.com/your-api-resource-id/user_impersonation");
    
    // 开启令牌保存,这样后续才能从HttpContext中获取到令牌
    options.SaveTokens = true;
    
    // 从UserInfo端点拉取额外声明,确保令牌相关信息完整
    options.GetClaimsFromUserInfoEndpoint = true;
});

3. 正确获取Access Token的方式

登录成功后,你可以在控制器或视图中通过以下代码获取Access Token:

var accessToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.AccessToken);

注意:一定要确保SaveTokens = true,否则令牌不会被持久化到HttpContext中,调用上述方法会返回null。

四、额外排查点

  • 如果还是报错,检查B2C应用注册的「回复URL」是否和你的MVC应用回调地址完全一致(包括http/https、端口号)。
  • .NET Core 2.0的Azure AD B2C中间件版本可能较旧,建议升级到对应分支的最新补丁(比如Microsoft.AspNetCore.Authentication.AzureADB2C.UI的2.0.x最新版本)。
  • 如果你不需要混合流,也可以用授权码流(ResponseType = OpenIdConnectResponseType.Code),通过code换取access_token,但混合流更适合MVC这种服务器端应用场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:08:42