UserManager的异步方法给出"调用方法的参数数量不正确布尔值等于"

时间:2014-06-05 13:19:29

标签: c# asp.net authentication asp.net-mvc-5 asp.net-identity

我已经制作了自定义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;
    }
}

1 个答案:

答案 0 :(得分:1)

您是否将UserManager类型更改为UserManager以告知您的用户密钥现在是int而不是字符串?

相关问题