【问题标题】:ASP.NET Core Identity async Overhead in Custom Stores自定义存储中的 ASP.NET Core Identity 异步开销
【发布时间】:2018-10-20 19:18:24
【问题描述】:

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

    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 创建一个状态机,它应该立即返回而没有任何大的开销,或者这样做有什么好处,我现在没有看到?

【问题讨论】:

    标签: c# asp.net-core-webapi asp.net-core-identity


    【解决方案1】:

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

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

    的实现

    此方法返回任务的原因是,实现可能需要数据库或网络访问。

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

    【讨论】:

    • 我了解您来自哪里,但是如果我可以调用 UpdateAsync 方法,为什么我应该在 getter/setter(如果那真的只是一个 getter/setter)中使用对我商店中 Db 的访问将更改传播到例如我的用户的用户名。为了澄清起见,我想使用 Identity 而不是所有功能,因为我知道我不需要其中一些功能。
    • 不确定我是否明白你的意思。是的,GetuserNameAsync 只是“我在这里有一个用户对象,想要获取我应该用作用户名的值”。 (可能是 Username 属性或 Email 属性的值或类似 mydb.GetUserNameFor(user.Id) 的结果。UserManager.UpdateAsync 用于更新数据库中的用户,因此完全不同。
    • 我试着澄清一下。如果我有我的 GetUserNameAsync 并且我给它我的 ApplicationUser 对象,我想要的值可以说是用户名。为什么我应该将此标记为异步并让某人选择等待它。有没有像现实世界的例子这样的事情,我需要进行异步操作,特别是如果我的 ApplicationUser 类在那里设置了他的所有值?当然,我可以去我的 Db 并获取一个“新的”ApplicationUser 来读出值,但是如果我的 ApplicationUser 具有所有值,我为什么要这样做?
    • 正如您所写的,在大多数情况下,这里绝对不需要执行异步操作。但是由于 GetUserNameAsync 是大型框架的一部分,我们需要一个定义的方法,其他类可以使用,其他设置理论上可能需要在这里进行数据库查找。仅当我们始终具有相同的签名时,其他框架类才能使用此方法。由于这个“其他设置可能需要异步”,这个 ONE 签名是异步的。请记住,开销非常小。
    • 啊,好的,谢谢你的澄清。我只是有点担心,因为我想我在某处读到,在调用 GetUserNameAsync 时创建这个在我的情况下无用的状态混搭的开销非常大。
    猜你喜欢
    • 2017-04-20
    • 2023-02-24
    • 2015-05-12
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多