私有 API 与 Microsoft AD 的 OAuth 授权流程
OAuth authorization flow for private API with Microsoft AD
我们公司使用Microsoft AD进行用户管理和认证,授权也是使用AD groups/roles。在大多数第三方应用程序中,用户可以使用他们的 AD 帐户进行身份验证。
现在我们正在开发新的应用程序,应该使用内部API。为此,我们在 Microsoft 租户中创建了一个新的企业应用程序并定义了几个角色。
在客户端,这是正常流程 - 用户使用他们的帐户进行身份验证,客户端收到它应该发送到 API 的访问令牌。这就是我不确定实施它的最佳方式的地方。
由于所有用户都已经存在于 AD 中,因此无需仅使用访问令牌来获取用户标识符和 create/link 内部数据库中的用户 - 我想使用 AD 用户并能够验证角色并“按原样”在 API 网关后面的服务中使用它们。但是角色没有存储在访问令牌中,所以我假设,我必须单独向 Microsoft 请求它们。但我也不想每次用户向我的 API 发送请求时都请求它们,并希望依赖客户端发送给我并且我可以验证的令牌。
那么最好的实现方式是什么?我是否应该在我们自己的身份验证服务中创建一个新的 Bearer JWT,包含我需要的所有信息,并将其提供给客户端,以便它每次都发送给我?客户端是否也应该使用此令牌来授权用户?但它也可以向微软申请IDToken?我们的内部令牌会取代 IDToken 和访问令牌吗?或者我们应该只使用 IDToken 来请求 API?
创建自己的令牌对我来说似乎是一种开销,因为我们只与 AD 用户合作,但我也不想在 API.
中使用 IDToken 进行授权
在 OAuth 架构中,您的应用程序(主要是 APIs)接受来自授权服务器(在您的情况下是 Azure AD)的令牌。然后,您使用这些令牌授权基于 Scopes and Claims 的数据请求。避免发行自己的代币并始终如一地使用 AS 代币。感觉你然后需要处理 domain specific claims
,这很棘手,这些是主要问题:
选项 1:JWT 访问令牌中的自定义声明
这需要 Azure AD 在令牌颁发时联系您的内部 API。这是首选选项,但可能不受支持或可能不受支持,具体取决于提供商和托管基础设施。
选项 2:通过查找自定义声明
这里有一些 example C# code of mine 展示了在目标 API 中形成自定义声明主体的技术。首次收到访问令牌时会查找额外的声明(通常从数据库中查找),然后缓存以供将来使用相同访问令牌的请求使用。它并不理想,但由于供应商的限制,我过去不得不使用它。
机密互联网令牌
在访问令牌中包含声明时要小心,不要向 Internet 客户端(例如 Web 或移动应用程序)泄露敏感数据。如果可能,请尽量使用 phantom token pattern,以免泄露任何敏感数据。如果授权服务器不支持发布引用令牌,那么上面的选项 2 可能是最不坏的选项。
我们公司使用Microsoft AD进行用户管理和认证,授权也是使用AD groups/roles。在大多数第三方应用程序中,用户可以使用他们的 AD 帐户进行身份验证。 现在我们正在开发新的应用程序,应该使用内部API。为此,我们在 Microsoft 租户中创建了一个新的企业应用程序并定义了几个角色。 在客户端,这是正常流程 - 用户使用他们的帐户进行身份验证,客户端收到它应该发送到 API 的访问令牌。这就是我不确定实施它的最佳方式的地方。 由于所有用户都已经存在于 AD 中,因此无需仅使用访问令牌来获取用户标识符和 create/link 内部数据库中的用户 - 我想使用 AD 用户并能够验证角色并“按原样”在 API 网关后面的服务中使用它们。但是角色没有存储在访问令牌中,所以我假设,我必须单独向 Microsoft 请求它们。但我也不想每次用户向我的 API 发送请求时都请求它们,并希望依赖客户端发送给我并且我可以验证的令牌。
那么最好的实现方式是什么?我是否应该在我们自己的身份验证服务中创建一个新的 Bearer JWT,包含我需要的所有信息,并将其提供给客户端,以便它每次都发送给我?客户端是否也应该使用此令牌来授权用户?但它也可以向微软申请IDToken?我们的内部令牌会取代 IDToken 和访问令牌吗?或者我们应该只使用 IDToken 来请求 API? 创建自己的令牌对我来说似乎是一种开销,因为我们只与 AD 用户合作,但我也不想在 API.
中使用 IDToken 进行授权在 OAuth 架构中,您的应用程序(主要是 APIs)接受来自授权服务器(在您的情况下是 Azure AD)的令牌。然后,您使用这些令牌授权基于 Scopes and Claims 的数据请求。避免发行自己的代币并始终如一地使用 AS 代币。感觉你然后需要处理 domain specific claims
,这很棘手,这些是主要问题:
选项 1:JWT 访问令牌中的自定义声明
这需要 Azure AD 在令牌颁发时联系您的内部 API。这是首选选项,但可能不受支持或可能不受支持,具体取决于提供商和托管基础设施。
选项 2:通过查找自定义声明
这里有一些 example C# code of mine 展示了在目标 API 中形成自定义声明主体的技术。首次收到访问令牌时会查找额外的声明(通常从数据库中查找),然后缓存以供将来使用相同访问令牌的请求使用。它并不理想,但由于供应商的限制,我过去不得不使用它。
机密互联网令牌
在访问令牌中包含声明时要小心,不要向 Internet 客户端(例如 Web 或移动应用程序)泄露敏感数据。如果可能,请尽量使用 phantom token pattern,以免泄露任何敏感数据。如果授权服务器不支持发布引用令牌,那么上面的选项 2 可能是最不坏的选项。