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

28

根据这份文档:应用和服务主体明显是两个不同的东西。应用是全局标识,而服务主体是每个租户/AAD的。

这份文档这个Stack Overflow问题表明它们是相同的。

更让人困惑的是,当我使用Graph API(来自第一个参考)并按我的应用程序名称查询时:

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

我看到一个对象ID,一个应用程序ID(我以为它们是一样的),但在Json中没有服务主体ID。

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

1个回答

42

简短回答: 应用程序和服务主体绝对是两个不同的事物(以1:多方式相关但绝对是不同的对象)。

使用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)之间的关系”的问题

首先,您问题中的链接Azure Active Directory中的应用程序和服务主体对象是了解概念的好资源。我不会比该文档更好地解释概念,所以如果需要,请多次阅读。但是,我将尝试突出一些信息来回答您的特定查询。

您可以将从Azure AD Graph API检索到的应用程序对象(或在Azure门户中的“应用注册”部分查看)视为正在开发并向Azure AD注册进行身份验证目的的软件应用程序的单个和主要定义。注意:在多租户应用程序的情况下,您只会在“主”租户中找到此应用程序对象,在该租户中,应用程序已在Azure AD中注册。

服务主体(Service Principal)是Azure门户中企业应用程序部分下可见的内容,与之相关的是Azure AD租户中将要使用此应用程序的内容。对于“主”租户,服务主体在应用程序注册时创建,而对于所有其他租户,在同意时创建服务主体。

因此,将始终只有一个应用程序对象来表示应用程序。在应用程序注册时至少会创建1个服务主体。尽管如此,当您从多个租户使用多租户应用程序时,每个新的Azure AD租户都会为用户授权应用程序创建1个服务主体。因此,应用程序和服务主体对象之间的关系变为1:多

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

顺便说一下,你困惑的另外两个链接更多地是如何文章,试图完成工作,而不是深入解释你正在寻找的概念。我不认为任何文档会明确表示应用程序和服务主体是同一事物(因为它们在技术上并不是)。尽管我可以理解有时会感到困惑,当应用程序和服务主体在身份验证相关任务的上下文中松散地互换使用时。

这里是另一个SO帖子,涉及类似的主题,由Jean-Marc Prieur提供了很好的答案。它可能无法回答您所有特定的问题,但肯定涵盖了这些概念。


1
感谢您提供的出色答案!特别是关于对象ID、如何查看SP ID等方面的讲解。因此,在通过RBAC/访问控制IAM Blade或Data Lake ACLs授予对Azure资源的访问权限时,我们授予的是应用程序还是服务主体(因为两者具有相同的显示名称)?https://learn.microsoft.com/en-us/azure/data-lake-store/data-lake-store-secure-data#assign-users-or-security-groups-to-data-lake-storage-gen1-accounts - Gadam
我可以不要脸地向您指出我的另一个相关问题:https://stackoverflow.com/questions/54055072/accesscontrolexception-when-net-client-app-accessing-azure-data-lake - Gadam
@Gadam 非常感谢。我对数据湖不是很熟悉,但根据我的一般理解,它将是特定 Azure AD 租户中的服务主体。我也会查看您的其他问题,看看是否能提供帮助。 - Rohit Saigal
这太好了。我正要问一个类似的问题。@RohitSaigal 所以如果我理解正确,在主租户内,应用程序和SP之间存在一对一的关系。只有当您有其他需要访问相同应用程序的租户时,1:多才会生效。因此,在单租户应用程序的情况下,您几乎可以将应用程序和sp视为同义词。因此,我想这就是混淆的原因。 - ScubaManDan
那么当我需要输入 principal_id 时,例如在此处创建新的角色分配 https://learn.microsoft.com/en-us/python/api/azure-mgmt-authorization/azure.mgmt.authorization.v2018_09_01_preview.models.roleassignmentcreateparameters?view=azure-python。我应该使用 appId 还是 objectId? - user1655072
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接