用户管理器 UserManager 不断抛出一个 System.ArgumentNullException 异常

9

我试图将AspNetUsers中的标准Idnvarchar更改为int。 我已经成功实现了这一点。 但是,当我尝试登录时,UserManager类一直报错。

我的代码如下:

public class UserManager : UserManager<ApplicationUser, int>
{
    public UserManager(IUserStore<ApplicationUser, int> store) 
    : base(store) 
{ 
}

在登录页面上,我有以下内容:

if (IsValid)
        {
            // Validate the user password
            var manager = Context.GetOwinContext().GetUserManager<UserManager>();
            var user = manager.Find(UserName.Text, Password.Text); //This line throws the error
            if (user != null)
            {
                IdentityHelper.SignIn(manager, user, isPersistent: false);
                Response.Redirect("~/Home.aspx");                }
            else
            {
                FailureText.Text = "Invalid username or password.";
                ErrorMessage.Visible = true;
            }
        }

我经常遇到的错误是 System.ArgumentNullException: Value cannot be null. Parameter name: manager。还有其他人遇到过这个问题吗?谢谢你提前的帮助。

堆栈跟踪(Stack Trace)

[ArgumentNullException: Value cannot be null.
Parameter name: manager]
Microsoft.AspNet.Identity.UserManagerExtensions.Find(UserManager`2 manager, String userName, String password) +221
Account_Login.LogIn(Object sender, EventArgs e) in Login.aspx.cs:17
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9628026
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
System.Web.UI.<ProcessRequestMainAsync>d__14.MoveNext() +5226

你能具体说明哪一行代码抛出了异常吗? - Moti Azu
对我来说,这行代码是关键:var user = manager.Find(UserName.Text, Password.Text); @MotiAzu - Izzy
@Izzy请粘贴您的ArgumentNullException的完整堆栈跟踪。 - wal
@wal,请查看更新后的问题。 - Izzy
1
可能是[MVC5(VS2012)Identity CreateIdentityAsync - Value cannot be null]的重复问题(https://dev59.com/g2Eh5IYBdhLWcg3w32xG)。 - Korayem
3个回答

15

请确保UserManager已在OWIN上下文中注册。您的Startup类应该有类似以下代码:

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

同时确保你的 web 程序集上已应用了 [assembly: OwinStartup(typeof(YourNamespace.Startup))] 特性。


尝试了您的建议后,我仍然遇到相同的错误,但是在 public CustomRoleStore(ApplicationDbContext context) 这一行出现了:/ - Izzy
@Izzy 这意味着解决方案是正确的,而你只是遇到了其他一些问题,这可能很难帮助你,因为你没有提供与该行相关的任何代码。 - decPL
1
@Izzy - 我建议您根据自己的判断,提供该代码或者如果它与问题无关则提出单独的问题(乍一看似乎不相关-您提供的部分没有提到您的“manager”实例)。 - decPL
@Izzy,也许你的 ApplicationDbContext 在 OWIN 中没有注册?检查我在对 ApplicationDbContext 的答案中所建议的相同事项。 - Sergey Kolodiy
@Sergey 我刚刚检查了我的 ApplicationDbContext 已经注册了。 - Izzy

2

manager.Find() 方法只在表的主键中搜索,您需要使用类似以下语句:

Context db = new Context();
if (db.Users.Select(u => u).Where(u => u.Username == Username && u.Pass == Password).ToList().Count() == 1)
{
      // login
}

0

我认为问题出在设置的基础上。请检查您的用户管理器是否已在您的OWIN上下文中注册。 如果您扩展了Identity ApplicationUser属性,请确保它们是公共的,并且具有getter和setter。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接