我们正在运行IdentityServer4 on .NET Core。目前,用户使用他们的AzureAD帐户登录--如果在数据库中找不到用户名,那么我们将查询微软的Graph来获取他们的组、一般信息等等。
最近,一个应用程序提出了两个几乎背靠背的登录请求--因为用户不存在,所以它进行了查询,并将他们的帐户添加了两次。
我一直在寻找处理这一问题的最佳方法,但据我所读到的,几乎所有的解决方案都被认为是糟糕的实践。
设置如下所示-登录后,用户被定向到AccountController - ExternalLoginCallback:
public async Task<IActionResult> ExternalLoginCallback(string returnUrl)
{
....
var user = await _users.AutoProvisionUser(provider, userId, externalUser, access_token, _options); // _users is the UserStore class
...
}AutoProvisionUser看起来是这样的:
public async Task<User> AutoProvisionUser(string provider, string userId, ClaimsPrincipal principal, string accessToken, Globals globals)
{
var user = await GetFullUserByUsernameAsync(principal.FindFirstValue(ClaimConstants.UPN));
if (user.Account == null)
{
user = await CreateUserAsync(principal, userId, accessToken, globals.AzureApplication);
}
else
{
await UpdateGroupsAsync(user.Account, accessToken, globals.AzureApplication);
}
return new User
{
Claims = principal.Claims.ToList(),
Name = user.Profile.DisplayName,
Provider = provider,
SubjectId = user.Account.AzureId,
Username = user.Account.UserName
};
}public async Task<UserIdentity> CreateUserAsync(ClaimsPrincipal principal, string userId, string graphAccessToken,
AzureApplication options)
{
// API calls to Microsoft, adding them to the database and then returning the user...
}我一直在考虑创建一个方法,对所有任务进行排队,并等待它们在继续执行之前完成--这是解决问题呢,还是另一个请求只是旋转一个新线程而忽略了当前的执行?
我还一直在考虑添加一个自定义DelegateHandler,并尝试在那里使用一些逻辑,看看我是否能够过滤掉“重复”请求。
我认为绝对最好的情况是,如果发出了另一个重复请求,则应用程序在执行user.Account ==空检查之前等待当前正在运行的任何任务。这是实现的实际吗?如果是的话,是通过包装上面提到的任务吗?
https://stackoverflow.com/questions/48423975
复制相似问题