在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
答案 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:
IUserStore