我有一个使用OpenIdConnect和Azure AD作为Office 365身份提供程序的多租户ASP.NET应用程序。当用户通过身份验证后,我会在ClaimsPrincipal.Current
中收到我的声明。
我想识别用户并将此id引用存储在我的数据库中。我问this question。有人回答说
当尝试唯一地识别用户时[NameIdentifier]应该是您的首选。
但似乎NameIdentifier
声称,http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
取决于应用程序。确切地说,如果我在Azure AD中创建另一个应用程序,那么NameIdentifier
对于同一个真正的Office365用户来说就不一样了。请记住,我们可能必须创建另一个Azure AD清单(因为我们可能需要其他范围),我们应该能够找回相同的最终用户。
与此同时,我评论了另一个主张:ObjectIdentifier
http://schemas.microsoft.com/identity/claims/objectidentifier
ObjectIdentifier
似乎对于给定Office 365用户的所有Azure AD保护应用程序都是相同的。
你能准确解释这两种说法之间的区别吗?更重要的是,您能否确认ObjectIdentifier
可以在任何Office 365订阅中用作用户的“通用”标识符。
确切地说,如果我在Azure AD中创建另一个应用程序,则NameIdentifier对于同一个真正的Office365用户将不同。
我进行了如下快速测试:
在AD Contoso中注册多租户-webapp和单租户-webapp。
使用[email protected]登录并在两个Web应用程序中获取名称标识符,事实证明两个应用程序中的名称标识符相同。因此,名称标识符应该能够识别用户跨应用程序,但不能用于标识Azure AD中的用户。
对于对象标识符,它是一个GUID,可用于标识Azure AD中的用户。例如,您可以使用对象标识符在Azure AD中查询用户。
电源外壳:
$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)来验证AS应用程序或使用真实用户凭证(即委托)使用日志记录,则无关紧要,NameIdentifier
将保持不变。
当使用客户端信用时,ObjectIdentifier
是用户在使用应用程序的委托或服务主体名称(SPN)时的用户主体名称(UPN)。
当应用程序是多租户时,您看到不同的ObjectIdentifier
值的原因是每个TENANT中都有一个单独且唯一的SPN,它指向应用程序注册的租户中的ApplicationGUID。此SPN用于根据每个租户中的资源为应用程序分配权限。