我一直在遵循 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 广告/身份平台与本地用户数据库进行映射。
我希望有人有一些提示,或者一些好的资源来指向我。
最好的问候/安德斯