如何通过Azure AD B2C ROPC流程实现API访问鉴权保护
Azure AD B2C ROPC流Token无法通过API鉴权的排查方案
先核Token本身的合法性,别先改代码
- 把Postman取到的access_token复制到JWT解析工具里解出payload,逐一核对三个核心字段:
aud字段:必须和你受保护API对应的应用注册客户端ID完全一致。如果这个值是你控制台客户端的应用ID,说明你请求Token时填错了scope:B2C下ROPC流请求Token的scope必须用带API标识的全路径格式,不能只填客户端ID或者openid/profile这类离线权限。iss字段:必须和API侧JWT校验配置的颁发者地址完全匹配。B2C的iss地址末尾会带上你用的ROPC用户流/自定义策略名,API侧配置授权机构地址的时候必须把这个带策略名的完整地址填上,漏写策略名100%校验失败。scp字段:必须包含你API授权要求的自定义scope值,缺任何一个要求的scope都会被拦截。
修正API侧JWT中间件的配置错误
- 不要直接套用普通Azure AD的JWT配置模板,B2C有几个必填配置不能漏,以.NET Core/.NET 5+为例,正确的认证配置参考如下:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 替换成你自己的租户名、ROPC策略名 options.Authority = "https://<你的B2C租户名>.b2clogin.com/<你的B2C租户名>.onmicrosoft.com/<你的ROPC策略名>/v2.0/"; // 替换成你API应用注册的客户端ID options.Audience = "<API应用的客户端ID>"; options.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = options.Authority, NameClaimType = "name" }; // 开发阶段临时打开下面的配置,能把Token校验失败的具体原因打到日志里 // options.IncludeErrorDetails = true; });
- 中间件注册顺序不能错:必须先调用
app.UseAuthentication(),再调用app.UseAuthorization(),顺序反了认证逻辑根本不会触发。需要鉴权的接口必须显式加[Authorize]特性,或者全局配置鉴权过滤器,别漏加。
核对B2C后台的权限配置
- 你用来请求Token的控制台应用,必须在「API权限」配置页,把受保护API暴露的所有自定义scope都添加上,并且点击「授予管理员同意」。没做管理员授权的话,就算请求Token时带了scope,返回的Token里也不会带对应的scp声明,API校验scope时会直接返回403。
- 打开受保护API对应的应用注册清单,确认
accessTokenAcceptedVersion字段值为2,如果是null或者1,颁发的Token版本和中间件预期不匹配,也会导致校验失败。
排查客户端调用的低级错误
- 向API发请求时,Authorization头格式必须是
Authorization: Bearer <你的access_token内容>,注意Bearer和Token之间有半角空格,不要拼错前缀,不要把引号、换行符之类的多余字符带进Token值里。 - 不要拿返回的id_token当access_token用:ROPC流返回结果里
access_token字段才是给API做鉴权用的,id_token是给客户端读取用户基本信息用的,用id_token调API必然返回401。
排查时优先打开JWT中间件的错误日志,具体是aud不匹配、iss不匹配还是scope不匹配,日志里会写得非常清楚,比无目的改代码效率高很多。
内容的提问来源于stack exchange,提问作者PicBuilder
相关产品推荐
相关产品推荐

