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

标签 security azure-active-directory azure-ad-graph-api

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

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

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

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

在 token 文档中,我读到 preferred_username 是可变的,“不得用于做出授权决定”。我可以看到逻辑,但在这种情况下,我只使用电子邮件进行身份验证而不是资源授权。
https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-tokens

所以我的问题是。是否有任何方式可以在 V2 id token 的“电子邮件”或“首选用户名”字段中显示欺骗性(未经验证的)电子邮件?

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

我可能的解决方法是发送我自己的验证电子邮件以将 MS 帐户与我们自己的帐户相关联,但我希望尽可能避免这种情况。

最佳答案

我怀疑这些可能会被欺骗。 更大的问题是用户主体名称/电子邮件是否更改。 正如您在 Token reference 中看到的那样,有 2 个声明可以更好地识别用户:

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

由于主题“始终存在于 Azure AD 发布的 token 中”,因此它可能是最佳选择。 例如,如果您需要在 Microsoft Graph API 中识别用户,则对象 ID 非常有用。

关于security - Azure Active Directory v2.0 电子邮件地址验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334479/

相关文章:

javascript - 以安全的方式将 JS 数据保存到数据库中

javascript - 使用 proxyAddresses 筛选器的 Microsoft Graph API 查询用户

asp.net-mvc - 如何从 HttpContext 获取 JWT(使用 OpenIdConnect),并将其传递给 Azure AD Graph API

azure - 在 Azure Active Directory 中删除应用程序的 AppRole

security - "no collisions have been found yet for this hashing method"到底是什么意思?

security - Tsung 安全 Websocket 支持

python - 如何证明 Python 是安全的

azure - 无需凭据即可向 Azure AD 进行身份验证

azure-active-directory - Azure AD Graph API 不返回创建用户的用户 GUID

azure - 从本地 Active Directory 同步用户后,OU 信息在 Azure 中不可用