ADFS应用组中Native Application与Server Application的区别及适用场景确认
嘿,我来帮你理清这个困惑——你之前的理解确实有点偏差,核心问题不是部署位置,而是客户端能不能安全存储凭据,这才是微软划分这两类应用的本质标准!
先纠正核心认知:不是部署位置,是凭据安全性
微软文档里的描述容易让人误以为是按“本地/远程”区分,但其实它背后的逻辑是OAuth2/OIDC体系里public client和confidential client的分类:
- Native Application属于public client:没法安全保存
client secret - Server Application属于confidential client:能安全保存
client secret
Native Application(Public Client)
有时称为public client,指运行在PC或设备上、供用户直接交互的客户端应用。
本质特点:
这类应用运行在用户完全可控的环境里,比如用户的电脑、手机、浏览器前端,client secret根本藏不住——随便抓个包、反编译一下就能拿到。所以ADFS对它的认证流程不依赖secret,而是用PKCE(授权码流加验证密钥)这类方式来确保安全。
适用场景:
- 本地桌面App(比如Windows客户端、Mac应用)
- 移动端App(iOS/Android)
- 纯前端SPA(React/Vue这类单页应用,代码全在浏览器端,没法存secret)
- 你的情况:哪怕你的应用部署在远程服务器上,如果它是纯前端SPA,或者你的OIDC实现没正确处理secret的传递,那用Native Application配置就会生效——因为它不需要验证secret就能完成认证流程。
Server Application(Confidential Client)
运行在服务器上、通常通过浏览器供用户访问的Web应用。由于它能维护自身的client secret或凭据,有时称为confidential client。
本质特点:
这类应用运行在你完全管控的服务器环境里,client secret可以存在配置文件、密钥管理服务里,完全不会暴露给用户。所以ADFS要求它在换取令牌时必须带上secret,以此验证请求的合法性。
适用场景:
- 传统服务器端渲染Web应用(比如ASP.NET MVC、Java Spring Boot项目)
- 后端API服务(需要调用ADFS获取令牌访问其他受保护资源)
- 任何能安全存储client secret的服务端应用
为什么你用Server Application配置失败?
大概率是你的应用没符合confidential client的要求:
- 要么是教程步骤有遗漏,比如没正确配置secret的传递逻辑
- 要么你的应用本身是纯前端SPA,根本没法安全存储secret,所以用需要验证secret的Server Application就会报错,换成Native Application就正常了
总结你的初始误解
你之前以为“Native是本地应用,Server是远程部署”,这是被表面描述误导了——部署位置只是常见场景,不是判断标准。哪怕是远程部署的纯前端应用,也属于public client,该用Native Application;哪怕是本地运行的服务端程序(比如本地调试的Spring Boot),只要能安全存secret,就可以用Server Application。
内容的提问来源于stack exchange,提问作者expenguin

