Microsoft 标识平台最佳做法和建议
本文重点说明在与 Microsoft 标识平台集成时的最佳做法、建议和最容易疏忽的问题。 此查检表可引导你完成高质量且安全的集成。 请定期查看此列表,确保维持应用与标识平台之间的集成的质量和安全性。 请不要参照该查检表来评审整个应用程序。 在我们不断改进平台的过程中,该查检表的内容将会更改。
如果你刚刚入门,请查看 Microsoft 标识平台文档来了解身份验证基础知识、Microsoft 标识平台中的应用方案,等等。
使用以下查检表确保应用程序与 Microsoft 标识平台有效集成。
提示
集成助手可帮助你应用其中许多最佳做法和建议。 选择任何应用注册,然后选择“集成助手”菜单项,开始使用助手。
基础
阅读并理解 Microsoft 平台策略。 确保应用程序符合旨在保护用户和平台的所述条款。
所有权
请确保与你用来注册和管理应用的帐户关联的信息是最新的。
品牌
遵守适用于应用程序的品牌准则。
为应用程序提供有意义的名称和徽标。 此信息将显示在应用程序的许可提示中。 确保提供的名称和徽标能够代表公司/产品的形象,以帮助用户做出明智的决定。 确保不要违反任何商标法案。
隐私
提供指向应用服务条款和隐私声明的链接。
安全性
管理重定向 URI:
- 保留所有重定向 URI 的所有权,并使其 DNS 记录保持最新。
- 不要在 URI 中使用通配符 (*)。
- 对于 Web 应用,请确保所有 URI 安全且已经过加密(例如,使用 https 方案)。
- 对于公共客户端,在适用的情况下请使用特定于平台的重定向 URI(主要适用于 iOS 和 Android)。 否则,请使用包含大量随机内容的重定向 URI,以防在回调应用时发生冲突。
- 如果在隔离的 Web 代理中使用应用,则可以使用
https://login.microsoftonline.com/common/oauth2/nativeclient
。 - 定期审查并修剪所有未使用或不必要的重定向 URI。
如果应用注册在目录中,最大限度地缩小并手动监视应用注册所有者的列表。
除非有明确的要求,否则不要启用对 OAuth2 隐式授权流的支持。 在此处了解有效方案。
不要仅使用用户名/密码。 不要使用资源所有者密码凭据流 (ROPC),因为它会直接处理用户的密码。 此流所需的信任度和用户公开度很高,仅当无法使用其他更安全的流时,才应使用此流。 在某些方案(比如 DevOps)中仍需要此流,但请注意,使用该流将对应用程序施加约束。 有关其他新式方法,请阅读身份验证流和应用程序方案。
保护和管理 Web 应用、Web API 和守护程序应用的机密应用凭据。 使用证书凭据,而不是密码凭据(客户端机密)。 如果必须使用密码凭据,请不要手动设置。 不要将凭据存储在代码或配置中,切勿允许人类处理这些凭据。 如果可能,请使用 Azure 资源的托管标识或 Azure Key Vault 存储和定期轮换凭据。
确保应用程序请求最低特权权限。 只在有需要时,才请求应用程序绝对需要的权限。 了解不同的权限类型。 仅在必要时使用应用程序权限;尽量使用委托的权限。 有关 Microsoft Graph 权限的完整列表,请参阅此权限参考。
如果正在使用 Microsoft 标识平台保护API,请谨慎斟酌应该公开的权限。 考虑解决方案需要哪种适当的粒度级,以及哪些权限需要管理员许可。 在做出任何授权决策之前,请检查传入令牌中的预期权限。
实现
使用新式身份验证解决方案(OAuth 2.0、OpenID Connect)确保用户安全登录。
不要直接对 OAuth 2.0 和 Open ID 等协议进行编程。 请改用 Microsoft 身份验证库 (MSAL)。 MSAL 库将安全协议安全地包装在一个易用的库中,你可以获得对条件访问方案的内置支持、设备范围单一登录 (SSO) 以及内置的令牌缓存支持。 有关详细信息,请参阅 Microsoft 支持的客户端库列表。 如果必须为身份验证协议手动编写代码,应遵循 Microsoft SDL 或类似的开发方法。 请认真对待每个协议的标准规范中的安全注意事项。
请勿查看访问令牌值,或尝试将其分析为客户端。 它们可能会更改值、格式,甚至在不发出警告的情况下进行加密 - 如果客户端需要了解有关用户的一些信息,请始终使用 ID 令牌。 只能由 Web API 分析访问令牌(因为格式定义和加密密钥设置就是由这些 API 完成的)。 客户端直接将访问令牌发送到 API 是一种安全风险,因为它们是授权访问某些资源的敏感凭据。 开发人员不应假定可以信任客户端来验证访问令牌。
将现有应用从 Azure Active Directory 身份验证库 (ADAL) 迁移到 Microsoft 身份验证库。 MSAL 是 Microsoft 的最新标识平台解决方案,可用于 .NET、JavaScript、Android、iOS、macOS、Python 和 Java。 详细了解如何迁移 ADAL.NET、ADAL.js 以及 ADAL.NET 和 iOS 中介应用。
对于移动应用,使用应用程序注册体验配置每个平台。 要使应用程序能够利用 Microsoft Authenticator 或 Microsoft 公司门户进行单一登录,需要为应用配置“中介重定向 URI”。 这样,在身份验证后,Microsoft 就可将控制权递回给应用程序。 配置每个平台时,应用注册体验会引导你完成该过程。 使用快速入门下载工作示例。 在 iOS 上,请尽可能地使用中介和系统 webview。
在 Web 应用或 Web API 中,为每个帐户保留一个令牌缓存。 对于 Web 应用,令牌缓存应使用帐户 ID 进行键控。 对于 Web API,帐户应使用用于调用该 API 的令牌的哈希值进行键控。 MSAL.NET 在 .NET 和 .NET Framework 中提供自定义令牌缓存序列化。 出于安全和性能方面的原因,我们建议为每个用户序列化一个缓存。 有关详细信息,请阅读令牌缓存序列化。
如果应用所需的数据可以通过 Microsoft Graph 获取,请使用 Microsoft Graph 终结点而不是单个 API 请求此数据的权限。
最终用户体验
了解同意体验并配置应用同意提示的片段,以便最终用户和管理员具有足够的信息来确定是否信任你的应用。
通过在交互式流之前尝试无提示身份验证(无提示令牌获取),最大限度地减少用户在使用应用时需要输入登录凭据的次数。
请勿对所有登录使用“prompt=consent”。 仅当你已确定需要请求其他权限的许可(例如,如果已更改应用的所需权限)时,才使用 prompt=consent。
如果适用,请使用用户数据扩充应用程序。 使用 Microsoft Graph API 可以轻松实现此目的。 Graph 浏览器工具可帮助你开始。
注册应用所需的完整权限集,使管理员能够轻松地向其租户授予同意。 在运行时使用增量许可,以帮助用户了解应用在首次启动时为何要请求可能会给用户带来忧虑或困惑的权限。
实现简洁的单一注销体验。 这是一项隐私和安全要求,有助于建立良好的用户体验。
测试
测试可能会影响用户使用应用程序的能力的条件访问策略。
使用你计划支持的所有可能帐户(例如,工作或学校帐户、Microsoft 个人帐户、子女帐户和主权帐户)测试应用。
其他资源
浏览有关 v2.0 的深入信息: