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"后报错,大概率是两个核心问题:
- 缺少API作用域配置:没告诉Azure B2C你要访问哪个API,它没法生成有效的access_token。
- 响应类型不匹配:.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
相关产品推荐
相关产品推荐

