繁体   English   中英

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

[英]Asp .Net Identity - Custom IUserStore FindByNameAsync method

我想覆盖IUserStore FindByNameAsync方法。 方法用于UserManager类的CreateAsync方法。 如果我从方法返回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;
}

我认为它在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方法返回什么以避免此异常?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM