首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在半长异步请求期间处理不耐烦的用户

在半长异步请求期间处理不耐烦的用户
EN

Stack Overflow用户
提问于 2018-01-24 13:44:34
回答 1查看 110关注 0票数 0

我们正在运行IdentityServer4 on .NET Core。目前,用户使用他们的AzureAD帐户登录--如果在数据库中找不到用户名,那么我们将查询微软的Graph来获取他们的组、一般信息等等。

最近,一个应用程序提出了两个几乎背靠背的登录请求--因为用户不存在,所以它进行了查询,并将他们的帐户添加了两次。

我一直在寻找处理这一问题的最佳方法,但据我所读到的,几乎所有的解决方案都被认为是糟糕的实践。

设置如下所示-登录后,用户被定向到AccountController - ExternalLoginCallback:

代码语言:javascript
复制
public async Task<IActionResult> ExternalLoginCallback(string returnUrl)
{
....
var user = await _users.AutoProvisionUser(provider, userId, externalUser, access_token, _options); // _users is the UserStore class
...
}

AutoProvisionUser看起来是这样的:

代码语言:javascript
复制
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
            };

        }
代码语言:javascript
复制
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 ==空检查之前等待当前正在运行的任何任务。这是实现的实际吗?如果是的话,是通过包装上面提到的任务吗?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48423975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档