通过MSAL 2登录Azure AD后,数据库CreatedBy字段应存储哪个UserId属性?
问题:MSAL 2完成Azure AD登录后,数据库CreatedBy字段应存储哪个用户ID?
成功通过MSAL 2完成Azure AD登录后,获取到如下对象:
environment:"login.windows.net" homeAccountId:"ID_1.ID_2" idTokenClaims:Object aio:"xxx" aud:"xxx" exp:1661778482 iat:1661774582 idp:"https://sts.windows.net/ID_2" iss:"https://login.microsoftonline.com/TENANT_ID" name:"xxx" nbf:1661774582 nonce:"xxx" oid:"ID_3" preferred_username:"xxx" rh:"xxx" sub:"xxx" tid:"xxx" uti:"xxx" ver:"xxx" localAccountId:"ID_3" name:"xxx" nativeAccountId:undefined tenantId:"TENANT_ID"
根据官方文档理解,应选取idTokenClaims.oid(与localAccountId值相同),但我认为存储永久用户ID应该用Azure门户中用户的Object ID字段,而该值似乎是homeAccountId中的ID_1,homeAccountId格式为ID_1.ID_2,其中ID_2也出现在idTokenClaims.idp中,这让我困惑。
现咨询:数据库CreatedBy字段中的UserId应存储以下哪一项?
idTokenClaims.oid(即localAccountId)?homeAccountId中的ID_1(等同于用户的Object ID)?
回答
应该存储idTokenClaims.oid(也就是localAccountId),原因如下:
oid(Object ID)本身就是Azure AD为用户分配的永久唯一标识符,和Azure门户里显示的用户Object ID完全一致,这个值在用户的整个生命周期内不会变更,是存储到数据库用户ID的标准选择。homeAccountId的格式是{用户Object ID}.{租户/身份提供者ID},其中的ID_1确实是用户的oid,但直接拆分这个字符串存在风险——MSAL对该字段的格式约定属于内部实现,未来若有变更会导致解析错误,不如直接使用ID Token中标准的oid声明更可靠。oid是Azure AD ID Token中的标准声明,跨应用、跨场景通用,不需要额外的字符串解析操作,代码实现更简洁稳定。
内容的提问来源于stack exchange,提问作者user2771704
相关产品推荐
相关产品推荐

