我已经自定义了User和UserStore类。
现在我正在尝试注册或登录用户,但我得到错误
'调用布尔方法时提供的参数数量不正确=(系统。字符串,系统。字符串,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)
现在错误不发生时,我登录与外部登录,如谷歌,它也使用UserManager的方法。输入电子邮件也可以,但是当必须使用插入的电子邮件从外部登录创建用户时,它也会给出CreateAsync
错误。
编辑UserManager.Create(User user)
也出现错误
这可能是因为UserManager中的方法对用户对象的id执行了Equal操作,而它期望的是字符串,而我的是int类型。但是因为我不能在UserManager中获得堆栈跟踪,而且我不知道如何在UserManager中重写这个方法,我不知道如何解决这个问题?
我该如何解决这个问题?我需要创建自己的UserManager吗?还是我需要另一种解决方案?
我的userstore代码:
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;
}
}
您是否将UserManager类型更改为UserManager以告诉它您的用户密钥现在是int而不是字符串?