0

我一直在遵循 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 个不同的用户权限,并且 User 对象在我们的模型中被广泛使用。

因此,我需要将 Azure AD 帐户与我们上下文中的给定用户对象结合起来。

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

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

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();
      }
    }
  }
}

对我的好处是:

  • 当我们系统中的管理员创建新用户时,管理员很容易找到与用户帐户关联的电子邮件,从而进行耦合。
  • 该电子邮件已在 MS 的登录过程中使用 - 因此必须假定为唯一的。
  • 客户只需使用正确的配置(在 Azure 和我们的应用程序中)在 Azure 应用程序注册中注册我们的应用程序,然后它就可以工作了。

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

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

或者是否有更好的替代方法将 Azure 广告/身份平台与本地用户数据库进行映射。

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

最好的问候/安德斯

4

1 回答 1

0

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

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

于 2020-09-10T12:36:15.773 回答