我已经实现了自定义用户界面和用户管理器,并成功避免使用实体框架。
public class CustomUserManager : UserManager<ApplicationUser> { }
public class CustomUserStore<T> : IUserStore<T>, IUserPasswordStore<T>, IQueryableUserStore<T>, IUserRoleStore<T>, IUserEmailStore<T>, IUserLockoutStore<T, string>, IUserTwoFactorStore<T, string>, UserPhoneNumberStore<T>, IUserLoginStore<T> where T : ApplicationUser { }
自定义用户界面包含许多方法,包括:
Task<string> IUserPasswordStore<T, string>.GetPasswordHashAsync(T user) {
return Task<string>.Factory.StartNew(() => {
return ((T)repository.GetUserByUserName(user.UserName)).PasswordHash;
});
}
Task IUserPasswordStore<T, string>.SetPasswordHashAsync(T user, string passwordHash) {
if (user == null) throw new ArgumentNullException("user");
user.PasswordHash = passwordHash;
return Task.FromResult(0);
}
一切都与我的身份实施完美配合,包括电子邮件确认和使用生成的用户令牌进行密码恢复。当我尝试从注入了usermanager的控制器调用上面的这两种方法时,我收到一个错误:
错误1&#39; mynamespace.CustomUserManager&#39;不包含&#39; SetPasswordHashAsync&#39;的定义没有扩展方法&#39; SetPasswordHashAsync&#39;接受类型&#39; mynamespace.CustomUserManager&#39;的第一个参数。可以找到
问题在于用户领域确实有这两种方法的定义。如果我将它们评论出来,那么自定义用户界面将无法构建。为什么控制器看不到它们的定义?
await customUserManager.SetPasswordHashAsync(user, hashedNewPassword); // build error
在应用程序中,我不需要将这些功能称为正常活动。问题是我从AspnetMembership迁移到AspNet.Identity并尝试自动进行密码迁移,而不是要求用户重置密码。如果我能让它发挥作用,那将是一次性的工作。