我有一个多租户ASP.NET应用程序,使用OpenIdConnect和Azure AD作为Office 365的身份提供程序。当用户通过身份验证后,我会在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
对于给定的Office 365用户,似乎ObjectIdentifier
对于所有Azure AD保护的应用程序都是相同的。
你能准确解释这两种说法之间的区别吗?更重要的是,您能否确认ObjectIdentifier
可以用作"通用"任何Office 365订阅中的用户标识符。
答案 0 :(得分:2)
准确地说,如果我在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订阅中的用户标识。
答案 1 :(得分:0)
或者换一种说法:
NameIdentifier
是已在Azure AD中注册的应用程序的GUID。无论是单租户还是多租户应用程序,这都不会改变。无论您使用客户端凭据(即AppId和AppSecret)对应用程序进行身份验证,还是使用使用真实用户凭据的日志记录(即委托),NameIdentifier
都将保持不变。
ObjectIdentifier
是使用客户端凭据时使用应用程序的委派或用户的应用程序的服务主体名称(SPN)时用户的用户主体名称(UPN)。
当应用程序是多租户时,您看到不同的ObjectIdentifier
值的原因是,每个租户中都有一个单独的唯一SPN,它指向注册该应用程序的租户中的ApplicationGUID。此SPN用于针对每个租户中的资源向应用程序分配权限。