我已经制作了自定义User和UserStore类 现在我正在尝试注册或登录用户,但我收到错误
'为调用方法Boolean提供的参数数量不正确 Equals(System.String,System.String,System.StringComparison)'
错误在第411行:
Line 409: }
Line 410: var user = new User() { UserName = model.Email, Email = model.Email };
--> Line 411: IdentityResult result = await UserManager.CreateAsync(user);
Line 412: if (result.Succeeded)
Line 413: {
我在
上遇到同样的错误UserManager.FindAsync(user), UserManager.CreateAsync(user,password)
现在,当我使用外部登录(例如Google)登录时,错误不会,它也使用来自UserManager的方法。输入电子邮件也很有用,但是当用户必须使用插入的电子邮件从外部登录创建时,它也会出现CreateAsync
错误。
编辑错误也发生在UserManager.Create(User user)
这可能是因为UserManager中的方法对用户对象的id执行了Equal,而它期望一个字符串而我的是一个int。但是因为我无法在UserManager中获得堆栈跟踪,而且我不知道如何在UserManager中覆盖此方法,我不知道如何解决这个问题?
我该如何解决这个问题?我需要创建自己的UserManager吗?或者我是否完全需要另一种解决方案?
我的用户代码:
public class UserStore :
IUserStore<User>,
IUserPasswordStore<User>,
IUserSecurityStampStore<User>,
IUserEmailStore<User>,
IUserLoginStore<User>
{
private readonly NFCMSDbContext _db;
public UserStore(NFCMSDbContext db)
{
_db = db;
}
public UserStore()
{
_db = new NFCMSDbContext();
}
#region IUserStore
public Task CreateAsync(User user)
{
if (user == null)
throw new ArgumentNullException("user");
_db.Users.Add(user);
_db.Configuration.ValidateOnSaveEnabled = false;
return _db.SaveChangesAsync();
}
public Task DeleteAsync(User user)
{
if (user == null)
throw new ArgumentNullException("user");
_db.Users.Remove(user);
_db.Configuration.ValidateOnSaveEnabled = false;
return _db.SaveChangesAsync();
}
public Task<User> FindByIdAsync(string userId)
{
int userid;
if(int.TryParse(userId,out userid))
throw new ArgumentNullException("userId");
return _db.Users.Where(u => u.UserId == userid).FirstOrDefaultAsync();
}
(...)
User.cs:
public sealed class User : IUser<int>
{
public User()
{
UserLogins = new List<UserLogin>();
}
public int UserId { get; set; }
public string UserName { get; set; }
public string PasswordHash { get; set; }
public string SecurityStamp { get; set; }
public string Email {get; set; }
public bool IsEmailConfirmed { get; set; }
int IUser<int>.Id
{
get { return UserId; }
}
public ICollection<UserLogin> UserLogins { get; private set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
答案 0 :(得分:1)
您是否将UserManager类型更改为UserManager以告知您的用户密钥现在是int而不是字符串?