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/
我有一个简单的 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/