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

时间:2018-03-17 09:29:45

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

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

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

到目前为止,这么好。我已经使用个人帐户和组织帐户对此进行了检查,但它确实有效。

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

由于主题“始终存在于Azure AD发布的令牌中”,因此它可能是最佳选择。 如果您需要在Microsoft Graph API中标识用户,则对象ID很好。