Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure active directory NameIdentifier与ObjectIdentifier_Azure Active Directory_Claims Based Identity_Office365api_Azure Ad Graph Api - Fatal编程技术网

Azure active directory NameIdentifier与ObjectIdentifier

Azure active directory NameIdentifier与ObjectIdentifier,azure-active-directory,claims-based-identity,office365api,azure-ad-graph-api,Azure Active Directory,Claims Based Identity,Office365api,Azure Ad Graph Api,我有一个多租户ASP.NET应用程序,使用OpenIdConnect和Azure AD作为Office 365的身份提供者。用户通过身份验证后,我将在ClaimsPrincipal.Current中收到我的声明 我想识别一个用户并将此id引用存储在我的数据库中。我问。 有人回答说 当试图唯一地识别用户时,您应该选择[NameIdentifier] 但似乎名称标识符声明,http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidenti

我有一个多租户ASP.NET应用程序,使用OpenIdConnect和Azure AD作为Office 365的身份提供者。用户通过身份验证后,我将在
ClaimsPrincipal.Current
中收到我的声明

我想识别一个用户并将此id引用存储在我的数据库中。我问。 有人回答说

当试图唯一地识别用户时,您应该选择[NameIdentifier]

但似乎
名称标识符
声明,
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
取决于应用程序。确切地说,如果我在Azure AD中创建另一个应用程序,那么对于同一个真正的Office365用户,
NameIdentifier
将不相同。请记住,我们可能必须创建另一个Azure广告清单(因为我们可能需要其他作用域),我们应该能够找到相同的最终用户

同时,我评论了另一个声明:
ObjectIdentifier
http://schemas.microsoft.com/identity/claims/objectidentifier

似乎对于给定Office 365用户的所有Azure AD安全应用程序而言,
ObjectIdentifier

你能准确地解释这两种说法之间的区别吗?更重要的是,您能否确认
ObjectIdentifier
可以用作任何Office 365订阅中用户的“通用”标识符

确切地说,如果我在Azure AD中创建另一个应用程序,那么同一个真正的Office365用户的NameIdentifier将不同

我做了如下快速测试:

在AD Contoso中注册多租户webapp和单租户webapp

登录user1@contoso.onmicrosoft.com并获取两个web应用程序中的名称标识符,结果发现两个应用程序中的名称标识符相同。因此,名称标识符应该能够跨应用程序识别用户,但不能用于在Azure AD中识别用户

对于对象标识符,它是一个GUID,可用于在Azure AD中标识用户。例如,您可以使用对象标识符在Azure AD中查询用户

Powershell:

$msolcred = get-credential
connect-msolservice -credential $msolcred
get-msoluser -ObjectId "{guid:object_identifier}"  
更重要的是,能否确认ObjectIdentifier可以用作任何Office 365订阅中用户的“通用”标识符


根据我的理解,对象标识符是一个GUID,可以为Office 365订阅中的用户标识。

或者换一种说法:


NameIdentifier
是在Azure AD中注册的应用程序的GUID。这不会改变它是单租户应用程序还是多租户应用程序。无论您是使用客户端凭据(即AppId和AppSecret)作为应用程序进行身份验证,还是使用真实用户凭据(即委派)进行日志记录,
NameIdentifier
都将保持不变

ObjectIdentifier
是用户在使用委托时的用户主体名称(UPN)或在使用客户端凭据时的应用程序服务主体名称(SPN)


当应用程序是多租户时,您看到不同的
ObjectIdentifier
值的原因是,每个租户中都有一个单独且唯一的SPN,它指向注册应用程序的租户中的ApplicationUID。此SPN用于根据每个租户的资源为应用程序分配权限。

您好,Jeffrey,谢谢您的回答。我可以从我这边确认,我收到了不同的姓名识别码。我的两个应用程序都是多租户的,它们不同于作用域:其中一个使用Groups.ReadAll(在Graph API中读取所有组)。你想要这些应用程序清单吗?@Benoit,谢谢你的详细信息。我将尝试对名称标识符进行更多测试。但对于对象标识符,它是Azure AD中的实际id,您可以使用此id通过Powershell在Azure AD中查询用户。
NameIdentifier
不是应用程序的guid。它是一个用户的唯一Id,该Id与经过身份验证的应用程序帐户有关(在隐式流中)。它保证是唯一的,但只在应用范围内。这就是为什么,如果重新创建应用程序,您将为同一用户获得不同的
NameIdentifier
。在隐式流的情况下,
ObjectIdentifier
是租户中用户的
ObjectId
。只要用户没有在租户中重新创建,就可以保证始终相同。对我来说,最可靠的是
ObjectIDentifier
。但是在多租户应用程序的上下文中,我不知道用户的
ObjectId
是否保证在所有租户中都是唯一的……我刚刚找到了我问题的答案:-)。您可以在这里查看:[.sub声明实际上是
NameIdentifier
声明,
oid
声明是
ObjectIdentifier
,并且保证它在所有Azure租户中都是唯一的。因此我认为数据库中的密钥的一个很好的候选者,它将持续应用程序的重新创建,是提供者Id的一个复合项(
idp
)和对象Id(
oid
)。是的NameIdentifier不是应用程序的guid。它是该应用程序中该用户的标识符objectId是Azure中该用户的Id(在所有应用程序中)对象Id不是UPN,因为这可以设置为实际用户帐户…(至少他们在我的组织中是这样做的)