使用AD B2C认证的Azure Function如何支持守护程序应用访问?
解决方案
核心原因确认
你遇到的401错误确实是令牌签发方不匹配导致:Azure Function App的身份认证默认仅校验配置的B2C用户流对应的签发方,而你通过客户端凭证流获取的令牌由Azure AD原生端点签发,不在允许列表内,因此被拦截。
具体配置步骤
1. 新增允许的令牌签发方
进入Azure Function App的管理界面:
- 依次打开「Authentication」=> 你已配置的Azure AD身份提供程序 => 点击「编辑」
- 切换到「高级」设置页,找到「允许的令牌发行者」配置项
- 在现有B2C签发方的基础上,新增客户端凭证令牌的签发方:
https://login.microsoftonline.com/<B2C-Tenant-Id>/v2.0 - 保存配置等待生效。
2. 配置应用访问权限
你需要为守护程序应用配置API访问权限,避免任意同租户应用都能调用你的Function:
- 打开保护Function App的AD B2C应用注册界面,进入「应用角色」页
- 新增自定义应用角色,例如名称为
Daemon.Access,成员类型选择「应用」,值和描述按业务需求填写,保存 - 进入你用来请求客户端凭证令牌的应用注册(如果是同一个应用注册可跳过),打开「API权限」页
- 点击「添加权限」=> 选择「我的API」=> 找到保护Function的应用注册 => 切换到「应用权限」=> 勾选你刚才创建的
Daemon.Access权限 - 点击「授予管理员同意」完成权限授权。
3. (可选)添加权限校验逻辑
如果需要限制只有持有对应应用权限的令牌才能访问,可以添加额外校验:
- 方式1:在Function App的身份认证「高级」设置中,添加
allowedAppRoles配置,值为你定义的应用角色值 - 方式2:在Function代码中解析JWT令牌,检查
roles声明是否包含对应的权限值,无权限时返回403。
验证方式
重新请求客户端凭证令牌后,可先解码JWT确认以下信息:
aud声明值为Function应用注册的Client IDiss声明值为你新增的允许签发方roles声明包含你定义的应用权限
确认无误后再调用Function App即可正常访问。
内容的提问来源于stack exchange,提问作者StZ
相关产品推荐
相关产品推荐

