我有一个Asp.Net核心3.1 MVC Web应用程序。我使用EF和身份 我正在将身份验证过程迁移到Azure AD(组织目录) 我需要找到一种方法来知道用户何时首次登录我的网站。
我想添加用户信息(例如首选颜色,名称等)并将其存储在本地数据库中 我的目标是知道用户何时首次登录,并将其重定向到个人资料页面以获取更多详细信息
基本上,我使用OnTicketReceived事件来实现。 在这种情况下,我将在登录过程完成后获取当前用户,然后从令牌中获取用户详细信息,并检查该用户是否已在我的本地数据库中。 现在,如果找不到用户记录,则需要将其重定向到他的个人资料页面。 我无法在OnTicketReceived事件中更改重定向URL,因此决定按以下方式创建中间件:
它正在工作,但是我敢肯定,有一种更简单的方法...
一些代码的东西: 在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);
}