ASP.NET 自定义商店中的核心身份异步开销

ASP.NET Core Identity async Overhead in Custom Stores

在开发 ASP.NET 核心 Web 应用程序时,我需要将 ASP.NET 核心标识添加到我的项目中。但是我只需要身份的一小部分,因为例如我知道这个应用程序永远不允许第三方登录。 因此我决定写我的自定义商店。在互联网上搜索有关如何做到这一点的好的解决方案时,我经常看到这样的实现:

    public Task SetUserNameAsync(ApplicationUser user, string userName, CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();

        if (user == null)
            throw new ArgumentNullException(nameof(user));

        if(string.IsNullOrWhiteSpace(userName))
            throw new ArgumentNullException(nameof(userName));

        user.Username = userName;

        return Task.CompletedTask;
    }

    public Task<string> GetUserNameAsync(ApplicationUser user, CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();

        if (user == null)
            throw new ArgumentNullException(nameof(user));

        return Task.FromResult(user.Username);
    }

据我所知,它会以这样的方式被调用:

var user = await store.GetUserNameAsync(_user, CancellationToken.None);

但这不会基本上为 getter/setter 创建一个状态机,它应该立即 return 而没有任何大的开销,或者这样做有什么好处,我没有看到现在?

Identity 是一个高度可定制的框架。例如。您可以创建自己的 UserManager,同时仍然使用处理登录、注销等的标准 SignInManager ...

您发现的似乎是 UserManager.GetUserNameAsync()> https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.usermanager-1.getusernameasync?view=aspnetcore-2.1

的实现

此方法 return 成为一项任务的原因是,实施 可能 需要数据库或网络访问权限。

如果您真的不想使用 Identity 的任何东西并自己做所有事情,则没有必要 return 任务。但老实说,如果这是一个好方法,我建议三思而后行。