ASP.NET核心标识的自定义UserStore

时间:2016-12-14 17:09:32

标签: asp.net .net asp.net-mvc entity-framework asp.net-core

根据GitHub发布的实施情况,我制作了自己的 UserStore RoleStore ,它们不使用实体框架< / strong>(在连接到真实数据库之前,我目前只需要一个简单的内存用户列表)。为了能够做到这一点,我不得不改变注册。我编写了自己的IdentityEntityFrameworkBuilderExtensions没有DbContext和TryAddSingleton而不是TryAddScoped,所以一旦初始化用户列表可以持续应用程序生命周期。问题是,Dispose方法被调用了很多次......我没有处理任何东西,但是有很多调用。是因为我制作了 UserStore RoleStore 单身,即使其他所有内容都是有效的吗?

第二件事是,完成工作 UserStore 的最低要求是什么?

danludwig wrote你只需要 IUserStore IUserPasswordStore ,这很可能,因为我做了一个实现这两个接口的商店和一个 RoleStore < / strong>使用 IRoleStore ,它似乎工作。由于启动类中的services.AddIdentity<ApplicationUser, IdentityRole>()部分,我也做了 RoleStore 。我为 ASP.NET核心Web应用程序(使用个人用户帐户)使用实体框架授权模板。

Arve Systad and Anderson Matos写道,你需要那些8:

  1. IUserStore<TUser>
  2. IUserPasswordStore<TUser>
  3. IUserTwoFactorStore<TUser>
  4. IUserClaimStore<TUser>
  5. IRoleStore<TRole>
  6. IUserSecurityStampStore<TUser, string>
  7. IUserRoleStore<TUser, string>
  8. UserManager<TUser>
  9. 删除所有 Entity Framework 包后,我了解到它只提供 UserStore RoleStore 实现(基于来自GitHub的源代码:

    1. IUserLoginStore,
    2. IUserRoleStore,
    3. IUserClaimStore,
    4. IUserPasswordStore,
    5. IUserSecurityStampStore,
    6. IUserEmailStore,
    7. IUserLockoutStore,
    8. IUserPhoneNumberStore,
    9. IQueryableUserStore,
    10. IUserTwoFactorStore,
    11. IUserAuthenticationTokenStore
      1. IQueryableRoleStore,
      2. IRoleClaimStore
      3. 删除软件包后,我尝试为 Entity Framework 身份验证模板执行最小方案 UserStore RoleStore ,然后我得:

        1. IQueryableUserStore,
        2. IUserPasswordStore,
        3. IUserSecurityStampStore,
        4. IUserLockoutStore,
        5. IUserTwoFactorStore,
        6. IUserRoleStore,
        7. IUserClaimStore
        8. 可能只有IRoleStore,因为只调用Dispose方法。大多数接口在应用程序生命周期内仅提供Get ....在添加用户时,我会收到一些名单,但它们来自 IQueryableUserStore IUserPasswordStore IUserSecurityStampStore IUserLockoutStore 。我真的需要所有这些接口吗?

          修改

          我目前的后EF UserStore 看起来像是这样,只实现了提到的方法:

          public class MyUserStore<TUser> :
              IQueryableUserStore<TUser>,
              IUserPasswordStore<TUser>,
              IUserSecurityStampStore<TUser>
              where TUser : MyIdentity
          {
              private List<TUser> _identities = new List<TUser>();
              CreateAsync(...)
              FindByIdAsync(...)
              FindByNameAsync(...)
              GetPasswordHashAsync(...)
              GetSecurityStampAsync(...)
              GetUserIdAsync(...)
              GetUserNameAsync(...)
              SetNormalizedUserNameAsync(...)
              SetPasswordHashAsync(...)
              SetSecurityStampAsync(...)
          }
          

          我想问的最后一件事是 UserStore 中setter方法的目的。他们主要在身份中设置一些额外的属性:

              public async Task SetNormalizedUserNameAsync(TUser user, string normalizedName, CancellationToken cancellationToken)
              {
                  cancellationToken.ThrowIfCancellationRequested();
                  ThrowIfDisposed();
                  if (user == null)
                  {
                      throw new ArgumentNullException("user");
                  }
                  user.NormalizedUserName = normalizedName;
                  await UpdateAsync(user, cancellationToken);
              }
          

          为什么呢?这是某种数据库边验证的一步吗?当您在添加新用户时检查应用程序所经历的路径并且它从 SetPasswordHashAsync 开始并以 CreateAsync 结束时...:P,这有点奇怪

0 个答案:

没有答案