简短回答:应用程序和服务主体绝对是两个不同的东西(以 1:many 方式相关,但绝对是不同的对象)。
使用 Azure AD 图形 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 中需要注意的小事:
objectId
您从上述查询中返回的应用程序对象和objectType
服务主体对象将有所不同。
appId
类似和的属性displayName
是相同的,因为它们与相同的逻辑应用程序相关。
您的问题 - AppID 和 ServicePrincipalID(以及 ClientID、ObjectID)之间的关系是什么
首先,您的问题Application and service principal objects in Azure Active Directory中的链接是理解概念的绝佳资源。在解释概念方面,我不会比那个文档做得更好,所以如果需要,请多读一遍。不过,我会尝试强调一些信息来回答您的具体问题。
您可以将您从上面的 Azure AD Graph API 检索到的应用程序对象(或参见 Azure 门户 > Azure Active Directory 的应用程序注册部分)视为您正在开发和向 Azure 注册的软件应用程序的单一和主要定义出于身份目的的广告。注意:对于多租户应用程序,您只能在“主”租户中找到此应用程序对象,其中应用程序已向 Azure AD 注册。
另一方面,服务主体(您在 Azure 门户 > Azure Active Directory 的企业应用程序部分看到的内容)将在每个想要使用此应用程序的 Azure AD 租户中创建。对于“家庭”租户,服务主体是在应用注册时创建的,对于所有其他租户,服务主体是在同意时创建的。
所以总是只有 1 个应用程序对象来表示应用程序。在应用注册时将至少创建 1 个服务主体。虽然,当您开始使用来自多个租户的多租户应用程序时,将为每个用户同意应用程序的新 Azure AD 租户创建一个服务主体。因此应用程序和服务主体对象之间的关系变为 1:many
appId
对于代表此应用程序的单个应用程序对象将是相同的,对于为此应用程序创建的所有服务主体也将是相同的。
objectId
将是应用程序对象和每个服务主体的唯一值。这唯一地标识了 Azure AD 中的对象。它是所有 Azure AD 对象(甚至是用户、组或其他任何 Azure AD 对象)的属性。
clientId
将与 相同appId
。它将与上下文相关,例如使用 Azure AD 支持的 OAuth 流之一获取令牌(例如,在使用 ADAL 库编写代码或使用 REST API 来访问 Azure AD 令牌端点时)。它不是应用程序或服务主体对象的确切名称的直接属性。
附带说明一下,使您感到困惑的其他两个链接更多的是如何尝试完成工作的文章,而不是深入解释您正在寻找的概念。我认为任何文档都不会明确说应用程序和服务主体是同一件事(因为它们在技术上不是)。虽然我可以理解它有时会让人感到困惑,但当在身份验证相关任务的上下文中松散地引用应用程序时,应用程序和服务主体可以互换使用。
这是关于类似主题的另一篇 SO 帖子, Jean-Marc Prieur 给出了很好的回答。它可能无法回答您的所有特定查询,但肯定会触及概念。