Azure:服务主体 ID 与应用程序 ID

Azure: Service Principal ID vs Application ID

According to this documentation:应用程序和服务主体显然是两个不同的东西。应用程序是全局身份和服务主体 根据 Tenant/AAD

This Documentation and This Stack Overflow Question表明它们是相同的。

为了让它更混乱,当我使用图形 API(来自第一个参考)并按我的应用程序名称查询时:

https://graph.windows.net/<tenantName>/applications?api-version=1.6&$filter=displayName eq '<Apllication Name>'

我在 Json

中看到一个对象 ID、一个应用程序 ID(我认为它们是相同的),但没有服务主体 ID

AppID 和 ServicePrincipalID(以及 ClientID、ObjectID)之间有什么关系? 谢谢

简短回答:应用程序和服务主体绝对是两个不同的事物(在 1:many 时尚中相关,但绝对是不同的对象)。

使用 Azure AD Graph API

正在寻找应用程序。正如你已经提到的问题。

https://graph.windows.net/<tenantName>/applications?api-version=1.6&$filter=displayName eq '<Apllication Name>'

寻找服务负责人

https://graph.windows.net/<tenantName>/servicePrincipals?api-version=1.6&$filter=displayName eq '<Apllication Name>'

json中需要注意的小事:

  1. objectIdobjectType 对于您从上述查询返回的应用程序对象和服务主体对象将有所不同。
  2. appIddisplayName 这样的属性是相同的,因为它们与相同的逻辑应用程序相关。

您的问题-AppID 和ServicePrincipalID(以及ClientID、ObjectID)之间的关系是什么

首先,您问题 Application and service principal objects in Azure Active Directory 中的 link 是理解概念的重要资源。我不会比该文档更好地解释概念,所以如果需要,请多读一遍。不过,我会尝试突出显示一些信息来回答您的具体问题。

您可以将从上面的 Azure AD Graph API 中检索到的应用程序对象(或在 Azure 门户的应用程序注册部分 > Azure Active Directory 中查看)视为软件的单一主要定义您正在开发并向 Azure AD 注册以用于标识目的的应用程序。注意:在多租户应用程序的情况下,您只能在 "home" 租户中找到此应用程序对象,其中应用程序已在 Azure AD 中注册。

另一方面,服务主体(您在 Azure 门户 > Azure Active Directory 的企业应用程序部分下看到的内容)将在每个想要使用此应用程序的 Azure AD 租户中创建。对于 "home" 租户,服务主体是在应用程序注册时创建的,对于所有其他租户,服务主体是在同意时创建的。

因此总是只有 1 个应用程序对象来表示应用程序。在应用程序注册时将至少创建 1 个服务主体。虽然,当你开始使用来自多个租户的多租户应用程序时,将为每个用户同意应用程序的新 Azure AD 租户创建 1 个服务主体。因此,应用程序和服务主体对象之间的关系变为 1:many

  • appId 对于表示此应用程序的单个应用程序对象是相同的,对于为此应用程序创建的所有服务主体也是相同的。
  • objectId 将是应用程序对象和每个服务主体的唯一值。这唯一标识 Azure AD 中的对象。这是一个 属性,您会在所有 Azure AD 对象中找到它,甚至是用户、组或任何其他 Azure AD 对象。
  • clientId 将与 appId 相同。它将与上下文相关,例如使用 Azure AD 支持的 OAuth 流程之一获取令牌(比如在使用 ADAL 库编写代码或使用 REST API 来命中 Azure AD 令牌端点时)。它不是直接的 属性,您会发现它具有应用程序或服务主体对象的确切名称。

附带说明一下,另外两个让您感到困惑的 link 更多的是关于如何完成工作的文章,而不是深入解释您正在寻找的概念。我认为没有任何文档会明确说明应用程序和服务主体是同一事物(因为它们在技术上不是)。虽然我能理解它有时会让人感到困惑,但当应用程序和服务主体在身份验证相关任务的上下文中松散地引用应用程序时可互换使用时。

这里是 on similar topic with a good answer from Jean-Marc Prieur。它可能无法回答您所有的特定问题,但肯定会触及概念。