使用客户端凭据流访问Azure Function App:为何需两个MS Entra Id应用注册?
你用单个应用注册能成功跑通客户端凭据流,本质是让这个应用同时扮演了被保护的API资源(Function App)和调用API的客户端两个角色。微软文档推荐分开创建两个应用,核心原因是安全、权限隔离和架构合理性,具体来说:
权限边界与安全风险控制
客户端应用只需要拥有调用API的权限,不需要具备管理API资源的能力。如果共用同一个应用注册,一旦客户端的凭据(Client Secret)泄露,攻击者可以直接修改API的配置、重置凭据甚至删除整个应用注册,风险覆盖范围极大。分开后,客户端的权限被严格限制在“调用目标API”,即使泄露,影响也仅停留在API调用层面,不会危及API资源本身的安全。符合OAuth2.0的标准角色模型
客户端凭据流的设计逻辑是:客户端(Client)向授权服务器请求访问**第三方资源服务器(Resource Server)**的权限。你当前的做法相当于“自己请求访问自己的资源”,技术上可行但偏离了标准模型,后续扩展(比如新增客户端、调整API权限)会变得混乱,难以维护。审计与管控更清晰
分开两个应用后,能分别监控客户端的调用行为和API资源的访问日志。比如可以精准查看哪些客户端在调用API,或者API被哪些身份访问,排查问题、合规检查都会更高效。如果共用一个应用,无法区分“客户端调用”和“资源自身操作”的日志,不利于问题定位。扩展性更强
后续如果要新增其他客户端(比如另一个服务、前端应用),只需要创建新的客户端应用注册,给它分配调用API的权限即可,完全不需要修改原API的应用注册配置。如果共用一个应用,每次新增客户端都得共享同一个凭据,或者在同一个应用下添加多个凭据,管理混乱且泄露风险倍增。
为什么你的单应用方式能工作?
当你用同一个应用注册时,请求令牌时把该应用的Client ID作为client_id,同时将它暴露的API范围作为scope,Entra ID会允许这个应用获取访问自身API的令牌——因为它本身就是API的所有者,所以技术上是可行的,但这只是一种简化的临时方案,绝不适合生产环境。
生产环境强烈建议遵循最佳实践,分开创建两个应用注册:一个作为API资源(绑定Function App的身份验证),另一个作为客户端应用(分配调用该API的权限)。
内容的提问来源于stack exchange,提问作者shantanu ghosh

