You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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应存储以下哪一项?

  1. idTokenClaims.oid(即localAccountId)?
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:01:12