Store未实现IUserPasswordStore <tuser> ASP.NET标识

时间:2015-06-05 03:38:02

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

在Visual Studio for 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>()));

一旦我这样做,我在注册时遇到错误。以下是错误。

  

商店未实施IUserPasswordStore

2 个答案:

答案 0 :(得分:6)

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

如果您不想重写有关散列过程的任何内容,请执行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的当前用户(当然可以是继承类)

查看代码,它非常简单,只需为对象分配哈希密码,返回对象中的内容以及检查用户是否有密码的布尔值。

答案 1 :(得分:0)

不要忘记 从IUserPasswordStore 接口继承您的UserStore.cs类

例如:

公共类UserStore: IUserStore , IUserPasswordStore , IUserRoleStore {...}