当可以从用户对象中提取所需的属性时,像 GetPhoneNumberAsync(IdentityUser user) 这样的 UserManager 方法的目的是什么?

Pan*_*ake 4 .net c# asp.net-core asp.net-core-identity asp.net-core-3.1

我试图了解 ASP.Net Core Identity UI 视图背后的一些逻辑。

例如,Account\Manage\Index.cshtml.cs 包含以下代码:

    private async Task LoadAsync(IdentityUser user)
    {
        var userName = await _userManager.GetUserNameAsync(user);
        var phoneNumber = await _userManager.GetPhoneNumberAsync(user);

        Username = userName;

        Input = new InputModel
        {
            PhoneNumber = phoneNumber
        };
    }
Run Code Online (Sandbox Code Playgroud)

当我们可以直接从用户对象中提取 PhoneNumber 属性时,为什么要调用 _userManager.GetPhoneNumberAsync(user) ?

pok*_*oke 6

默认身份设置由实体框架映射到数据库的实体组成,这一事实是用户管理器不关心的实现细节。用户管理器实际上是以某种方式实现的,它主要充当各种提供密码验证、散列等功能的单个组件的外观

其中一个组件是IUserStore<>负责以某种方式实际持久化身份对象的 。

默认实现是UserStore<>Microsoft.AspNetCore.Identity.EntityFrameworkCore. 请注意,命名空间包含EntityFrameworkCore因此这是唯一实际特定于如何持久保存用户对象的内容:使用 EF Core。

一般IUserStore<>只负责实际存储和存储用户对象。但是,商店实现可以通过各种功能标志接口启用其他功能,例如电话号码支持。例如IUserClaimStore<>IUserEmailStore<>IUserPhoneNumberStore<>、 或IUserTwoFactorStore<>。这些是用户管理器上的所有高级方法将经过的过程,以确定 (a) 对该功能的支持,以及 (b) 如何获取这些值。

因此,如果您仅将用户视为由 ORM 持久化的实体,那么用户管理器的这种设计似乎很复杂,但它实际上允许交换用户管理器后面的整个架构,而不会影响前端。这就是默认身份 UI 使用这些方法的原因,不必依赖于用户是实体的实现细节,而是通过用户管理器来检索它需要的值。

这对您的应用程序有影响吗?可能不是。如果您决定使用带有 的默认用户存储IdentityUser,那么您可以直接访问属性。应用程序以后不太可能完全切换所有这些,然后您可能还必须进行其他更改。因此,对于您的应用程序代码,您可以直接访问实体的属性。