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

Min*_*nja 6 c# asp.net asp.net-web-api asp.net-identity

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

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

这是我的覆盖方法

public Task<MyUser> FindByNameAsync(string userName)
{
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我认为它在下面的代码片段中的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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*gor 6

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

public Task<MyUser> FindByNameAsync(string userName)
{
    return Task.FromResult((MyUser)null);
}
Run Code Online (Sandbox Code Playgroud)