【问题标题】:Store does not implement IUserPasswordStore<TUser> ASP.NET Identity存储未实现 IUserPasswordStore<TUser> ASP.NET 标识
【发布时间】:2015-06-05 03:38:01
【问题描述】:

在 Visual Studio 为 Web Api 2 项目的 ASP.NET 身份验证生成的模板项目中,我添加了一个类 ApplicationUserStore(这是我的自定义用户存储)

public class ApplicationUserStore : IUserStore<ApplicationUser>
{
    private readonly ApplicationDbContext _context;

    public ApplicationUserStore(ApplicationDbContext context)
    {
        _context = context;
    }

    public async Task<ApplicationUser> FindByIdAsync(string userName)
    {
        return await _context.Users.Include(x => x.FMBP_Company).FirstOrDefaultAsync(n => n.UserName == userName);
    }

    public Task CreateAsync(ApplicationUser user)
    {
        throw new NotImplementedException();
    }

    public Task DeleteAsync(ApplicationUser user)
    {
        throw new NotImplementedException();
    }

    public Task<ApplicationUser> FindByNameAsync(string userName)
    {
        return _context.Users.Include(x => x.FMBP_Company).FirstOrDefaultAsync(n => n.UserName == userName);
    }

    public Task UpdateAsync(ApplicationUser user)
    {
        throw new NotImplementedException();
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

我这样做基本上是因为每当我执行 FindByIdAsync 时我都想要 FMBP_Company 对象。

我什至更改了 IdentiyConfig.cs 并添加了以下行,以便我可以使用我的自定义用户存储。

var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get<ApplicationDbContext>()));

完成此操作后,我在注册时遇到错误。以下是错误。

Store 没有实现 IUserPasswordStore

【问题讨论】:

  • 那么您是否更新了ApplicationUserStore 以实现IUserPasswordStore 接口?然后你会有public class ApplicationUserStore : IUserStore&lt;ApplicationUser&gt;, IUserPasswordStore&lt;ApplicationUser&gt;
  • @BrendanGreen 是的,我现在已经实现了这个接口,但是我不知道在这里实现什么,因为我还不需要自定义密码代码
  • weblogs.asp.net/imranbaloch/… 解决了我的问题

标签: c# asp.net asp.net-web-api2 asp.net-mvc-5.1


【解决方案1】:

回答您的问题。 在身份验证期间,除非您实现一些非常特殊的东西,否则您需要实现多个接口,因为一旦您控制了管理器和存储库,您就必须提供代码来处理几件事情。 即使您不想实现自定义的密码散列,也必须实现接口,因为管理器已被覆盖并且没有更多的密码处理实现。

如果您不想重写任何有关哈希过程的内容,请实现 IUserPasswordStore 并简单地编写:

        public Task SetPasswordHashAsync(YourUser user, string passwordHash)
        {
            user.PasswordHash = passwordHash;
            return Task.FromResult(0);
        }
        public Task<string> GetPasswordHashAsync(YourUser user)
        {
            return Task.FromResult<string>(user.PasswordHash);
        }
        public Task<bool> HasPasswordAsync(YourUser user)
        {
            return Task.FromResult<bool>(!String.IsNullOrEmpty(user.Password));
        }

YourUser 通常是 IUser 的当前用户(当然也可以是继承的类)

看代码,很简单,就是给对象分配哈希后的密码,返回对象中的内容和判断用户是否有密码的布尔值。

【讨论】:

    【解决方案2】:

    不要忘记在 UserStore.cs 类中实现 IUserPasswordStore&lt;MyIdentityUser&gt; 接口。

    例如:

    public class UserStore : 
      IUserStore<MyIdentityUser>,
      IUserPasswordStore<MyIdentityUser>,
      IUserRoleStore<MyIdentityUser>
    {
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2021-12-19
      • 2021-08-15
      • 1970-01-01
      相关资源
      最近更新 更多