在我们的解决方案中将 Azure AD 与现有用户帐户相结合

Coupling Azure AD with existing user accounts in our solution

我一直在按照 Microsoft Identity Platform 文档中的步骤操作,以在我们现有的 Angular SPA 上启用 Azure AD 身份验证,使用 .Net Core 2.1 API 作为后端。

https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-overview

基础知识现在可以使用了,但我有一个问题我一直找不到好的答案。

在我们当前的系统中,我们有一个现有的用户和权限模型,我需要保留它。我们可以设置 2.000 个不同的用户权限,并且在我们的模型中广泛使用用户对象。

因此,我需要将 Azure AD 帐户耦合到上下文中的给定用户对象。

我们现有的身份验证解决方案在 JWT 中声明了用户标识符 - 当令牌在 API 中得到验证时,我可以使用该声明在请求中设置当前用户上下文。

最明显的解决方案是在从 Azure 返回的 id-token 中使用“preferred_username”声明。因此,在 API 方面,在 JWT 身份验证验证令牌后,我更改了 SetCurrentUserMiddleware 中的逻辑,以根据 AzureAD 电子邮件查找用户 - 并基于此设置用户上下文。来自中间件的片段 class

public async System.Threading.Tasks.Task Invoke(HttpContext context)
{
  var currentPrincipal = context.User;
  if(currentPrincipal != null)
  {
    if(currentPrincipal.Identity.IsAuthenticated)
    {
      if(currentPrincipal.HasClaim((x) => x.Type == "preferred_username"))
      {
        var email = currentPrincipal.FindFirst((x) => x.Type == "preferred_username").Value;
        if (!String.IsNullOrEmpty(email))
          CurrentUser = new User { WindowsUserName = email }.FetchOne();
      }
    }
  }
}

对我的好处是:

我们的解决方案以多种方式部署。有些客户由我们托管,每个客户在不同的域上,有些则全部在内部部署

现在出现的问题是,这是否是首选方式,是否是一种安全的方式。

或者是否有更好的替代方案来将 Azure Ad / Identity Platform 映射到本地用户数据库。

我希望有人能给我一些提示,或者一些好的资源来指点我。

此致 /安德斯

可以使用用户主体 name/email 完成初始映射,但您应该存储用户的 oid 或 sub 声明,而不是将来映射它们,因为它们是不可变的。 用户的 UPN/email 可以更改,因此它不是一个稳定的标识符。

oid 声明(又名 objectId)是用于识别用户的唯一不可变 ID,例如在 Microsoft Graph API 中。 sub 声明(又名名称标识符)也是一个唯一的不可变 ID,但您的应用程序获得的值对于该应用程序是唯一的,因此另一个应用程序将在此处获得不同的值。

通常我建议存储 objectId,因为它允许您在需要时从 MS Graph API 查询数据。

ID 令牌参考:https://docs.microsoft.com/en-us/azure/active-directory/develop/id-tokens#payload-claims