Store未实现IUserPasswordStore ASP.NET身份

问题描述 投票:5回答:2

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

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

Store未实现IUserPasswordStore

c# asp.net asp.net-web-api2 asp.net-mvc-5.1
2个回答
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的当前用户(当然可以是继承类)

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


0
投票

DONT FORGET从IUserPasswordStore <MyIdentity User>接口继承您的User Store.cs类

例如:

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

© www.soinside.com 2019 - 2024. All rights reserved.