Azure Active Directory v2.0 电子邮件地址验证

Azure Active Directory v2.0 Email Address Verification

我正在尝试使用 MSAL 库和 V2 端点将 "Sign in with Microsoft" 按钮添加到 Angular 应用程序。该应用程序需要与个人和组织帐户一起使用,然后这些帐户将与我数据库中的现有用户交叉引用。即 Microsoft 登录只是我现有登录系统之上的一种便利。

目前我采用的流程是:
1. 用户通过浏览器中的隐式流请求 JWT id 令牌,使用图形范围 openid email profile.
2. 浏览器将 id 令牌发回服务器。
3. 服务器验证令牌(我允许多个租户并且不检查 JWT 的颁发者字段)。
4. 服务器首先在 email 声明中查找电子邮件。
5. 如果不存在 email 声明,则检查 preferred_username.
6. 如果电子邮件与我们的注册地址之一匹配,则用户已登录。如果不匹配或没有电子邮件,则返回错误。

到目前为止,还不错。我已经用个人帐户和组织帐户对此进行了检查,它有效。

但是,整个方法在很大程度上依赖于被验证用户的电子邮件地址。

在令牌文档中我读到 preferred_username 是可变的并且 "must not be used to make authorization decisions"。我可以看到逻辑,但在这种情况下,我只使用电子邮件进行身份验证而不是资源授权。
https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-tokens

所以我的问题是。是否有任何方式可以在 V2 id 令牌的 "email" 或 "preferred_username" 字段中显示欺骗性(未验证)电子邮件?

如果是,我是否可以使用图 API 进行交叉检查以查看它是否已被验证?

我可能的解决方法是使用我们自己的帐户将我自己的验证电子邮件发送到 link MS 帐户,但我想尽可能避免这种情况。

我怀疑这些可能是被欺骗的。 一个更大的问题是如果用户主体 name/email 发生变化。 正如您在 Token reference 中看到的那样,有 2 个声明可以更好地识别用户:

  • 主题(子)
    • 令牌断言信息的主体,例如应用程序的用户。这个值是不可变的,不能重新分配或重用。它可用于安全地执行授权检查,例如当令牌用于访问资源时,并且可用作数据库表中的键。由于主题始终存在于 Azure AD 颁发的令牌中,因此我们建议在 general-purpose 授权系统中使用此值。然而,主题是一个成对的标识符——它对于特定的应用程序 ID 是唯一的。因此,如果单个用户使用两个不同的客户端 ID 登录两个不同的应用程序,这些应用程序将收到两个不同的主题声明值。这可能需要也可能不需要,具体取决于您的体系结构和隐私要求。
  • 对象 ID (oid)
    • Microsoft 标识系统中对象的不可变标识符,在本例中为用户帐户。它还可用于安全地执行授权检查并作为数据库表中的键。此 ID 跨应用程序唯一标识用户 - 登录同一用户的两个不同应用程序将在 oid 声明中收到相同的值。这意味着它可以在查询 Microsoft 在线服务(例如 Microsoft Graph)时使用。 Microsoft Graph 将 return 此 ID 作为给定用户帐户的 ID 属性。由于 oid 允许多个应用程序关联用户,因此需要配置文件范围才能接收此声明。请注意,如果单个用户存在于多个租户中,则该用户将在每个租户中包含不同的对象 ID - 它们被视为不同的帐户,即使用户使用相同的凭据登录每个帐户也是如此。

既然主题是"always present in the tokens that Azure AD issues",这可能是最好的选择。 例如,如果您需要在 Microsoft Graph API 中识别用户,则对象 ID 很好。