Azure AD身份验证后首次登录网站

时间:2020-10-28 13:26:58

标签: asp.net-core azure-active-directory

我有一个Asp.Net核心3.1 MVC Web应用程序。我使用EF和身份 我正在将身份验证过程迁移到Azure AD(组织目录) 我需要找到一种方法来知道用户何时首次登录我的网站。

我想添加用户信息(例如首选颜色,名称等)并将其存储在本地数据库中 我的目标是知道用户何时首次登录,并将其重定向到个人资料页面以获取更多详细信息

基本上,我使用OnTicketReceived事件来实现。 在这种情况下,我将在登录过程完成后获取当前用户,然后从令牌中获取用户详细信息,并检查该用户是否已在我的本地数据库中。 现在,如果找不到用户记录,则需要将其重定向到他的个人资料页面。 我无法在OnTicketReceived事件中更改重定向URL,因此决定按以下方式创建中间件:

  1. 在OnTicketReceived中,我检查用户是否在本地数据库中,并将“ NewUser”键添加到会话中。
  2. 添加了运行并检查会话密钥的NewUserMiddleware。如果退出“ NewUser”键,我将在本地数据库中生成一条新记录,然后重定向到配置文件页面,然后删除该键

它正在工作,但是我敢肯定,有一种更简单的方法...

  • 我不想创建注册按钮-该网站位于组织内部,因此我不需要创建匿名注册页面

一些代码的东西: 在OnTicketReceived中:

var db = context.HttpContext.RequestServices.GetService<MyDbContext>();
var user = db.Users.SingleOrDefault(u => u.Email == email);
if (user == null)
{
    context.HttpContext.Session.SetInt32("NewUser", 1);
} 

NewUserMiddleware:

public async Task InvokeAsync(HttpContext context)
{
    int? isNewUser = context.Session.GetInt32("NewUser");
    if(isNewUser.HasValue && isNewUser.Value == 1)
    {
        MyDbContext _dbContext = context.RequestServices.GetService(typeof(MyDbContext)) as MyDbContext;
        var identity = context.User.Identity as ClaimsIdentity;
        string email = identity.FindFirst(c => c.Type == "preferred_username")?.Value;
        string name = identity.FindFirst(c => c.Type == "name")?.Value;
        User user = new User()
        {
            Email = email,
            UserName = name,
            Color = GenerateColor()
        };
        _dbContext.Users.Add(user);
        _dbContext.SaveChanges();
        context.Session.Remove("NewUser");
        await context.Session.CommitAsync();
        context.Response.Redirect("account/profile", true);
    }            

    await _next(context);
}

0 个答案:

没有答案