Asp .Net Identity - 自定义IUserStore FindByNameAsync方法

时间:2016-07-15 16:24:58

标签: c# asp.net asp.net-web-api asp.net-identity

我想覆盖IUserStore FindByNameAsync方法。方法用于CreateAsync类的UserManager方法。如果我从方法返回IdentityUser实例,它可以正常工作,但如果我返回null(例如没有用户使用该用户名),我得到了:

  

{"消息":"发生错误。"," ExceptionMessage":"对象引用未设置为对象的实例"" ExceptionType":" System.NullReferenceException""堆栈跟踪":"在Microsoft.AspNet.Identity.UserValidator`2。 ValidateUserName d__4.MoveNext()

这是我的覆盖方法

public Task<MyUser> FindByNameAsync(string userName)
{
    return null;
}

我认为它在下面的代码段中UserValidator类 - ValidateUserName方法失败了。

else
{
    var owner = await Manager.FindByNameAsync(user.UserName).WithCurrentCulture();
    if (owner != null && !EqualityComparer<TKey>.Default.Equals(owner.Id, user.Id))
    {
        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, user.UserName));
    }
}

FindByNameAsync方法返回什么以避免此异常?

1 个答案:

答案 0 :(得分:5)

您还必须在代码中返回任务,请参阅下面的更改。这是因为调用者期望一个Task,并且Task中的结果是您想要返回的值null。通过直接返回null,调用者尝试解包任务(通过awaitTask.Result)会失败,从而生成NullReferenceException

public Task<MyUser> FindByNameAsync(string userName)
{
    return Task.FromResult((MyUser)null);
}