ASP.使用Azure Active Directory的.NET标识..AspNetUsers数据库记录是何时/如何创



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

我已经为登录/身份验证设置了Microsoft Identity。这真的很有效。用户请求一个页面,它们被发送到公司azure active directory登录页面(包括2fa(,并返回到通过用户声明验证的应用程序。

但是。。。我的身份数据库表保持为空(AspNetUsers等人(。我有点期待创建一个代表刚刚登录的用户的记录

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

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

想法?我的期望值不正常吗?

我在这方面做得太离谱了。

微软。身份Web和Microsoft。身份网状物UI不需要/创建AspNetUsers表(等(。

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

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/

最新更新