ASP.NET 使用 Azure Active Directory 的身份...when/how 是创建的 AspNetUsers 数据库记录

ASP.NET Identity using Azure Active Directory... when/how are AspNetUsers db records created

我有一个简单的 MVC .Core 6 Web 应用程序,将在公司外联网上使用(通过 Azure 应用程序服务)。

我已经为 login/authentication 设置了 Microsoft Identity。这真的很好用。用户请求一个页面,他们被发送到企业 Azure Active Directory 登录页面(包括 2fa)并返回到使用用户声明进行身份验证的应用程序。

但是...我的身份数据库 table 仍然是空的(AspNetUsers 等)。我有一半希望创建一条代表刚刚登录的用户的记录。

我搭建了 ExternalLogin.cshtml 页面,希望它在用户登录后显示(如果 userManager.GetUserAsync(User) == null,我可以在那里手动创建用户)。但是页面从未显示

我想我想要 AspNetUsers table 条目,因为我的简单应用程序做了一些审计跟踪工作(CreatedByUserId、LastUpdatedByUserId),我希望这些是 AspNetUsers table 的外键。

想法?是不是我的期望不对?

我在这方面偏离了方向。

Microsoft.Identity.Web 和 Microsoft.Identity.Web.UI 不要 need/create AspNetUsers table (et al).

如果您想在用户登录应用程序时构建自己的用户table,您可以执行以下操作:

builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, opts =>
{
    opts.Events = new OpenIdConnectEvents()
    {
        OnTicketReceived = async (context) =>
        {
            //
            // Pull out the user details
            //
            var objectidentifier = context.Principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier");
            var nameidentifier = context.Principal.FindFirstValue(ClaimTypes.NameIdentifier);
            var name = context.Principal.FindFirstValue("name");
            var email = context.Principal.FindFirstValue("preferred_username");

            // 
            // Demo code to create a record in a users db table
            //
            using var scope = context.HttpContext.RequestServices.CreateScope();
            var ctx = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            var isUserExists = await ctx.MyApplicationUser.AnyAsync(u => u.ObjectIdentifier == objectidentifier);
            if (!isUserExists)
            {
                var applicationUser = new MyApplicationUser()
                {
                    ObjectIdentifier = objectidentifier,
                    NameIdentifier = nameidentifier,
                    Email = email,
                    Name = name,
                };
                ctx.MyApplicationUser.Add(applicationUser);
                await ctx.SaveChangesAsync();
            };
        }
    };
});

请注意,需要小心谨慎才能得出正确的声明。

请注意,如果现有用户的详细信息发生变化(名称确实发生变化),这可能会更新现有用户。

这与我在以下位置找到的内容略有修改:https://dotnetthoughts.net/azure-active-directory-b2c-in-aspnet-core-mvc-part1/