【问题标题】:UserManager's async methods giving "Incorrect number of arguments for call to method Boolean Equals"UserManager 的异步方法给出“调用布尔等于方法的参数数量不正确”
【发布时间】:2014-07-26 12:21:33
【问题描述】:

我已经制作了自定义 User 和 UserStore 类。
现在我正在尝试注册或登录用户,但我收到错误

'为调用布尔方法提供的参数数量不正确 等于(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 错误。


EDIT 错误也出现在UserManager.Create(User user)


这可能是因为 UserManager 中的方法对用户对象的 id 执行了 Equal,而它期望的是字符串,而我的是 int。但是因为在UserManager里面拿不到stacktrace,也不知道怎么在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();
    }
(...)

用户.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;
    }
}

【问题讨论】:

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


    【解决方案1】:

    您是否将您的 UserManager 类型更改为 UserManager 以告诉它您的用户密钥现在是 int 而不是 string?

    【讨论】:

    • 这就是问题所在。 UserManager 是封闭的 DLL Microsoft.AspNet.Identity 中的一个类。我已经使用 Resharper 对其进行反编译,但它没有显示字符串均衡。所以,我不知道如何告诉 UserManager 一些值已经改变,我什至不确定 User 模型的这些改变是错误的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多