asp.net identity SetEmailConfirmedAsync



我的UserStore类中的SetEmailConfirmedAsync方法有问题。

一切都很好,用户使用哈希密码创建,为确认电子邮件生成令牌,电子邮件发送成功。当我尝试验证电子邮件时,问题出现了

public async Task<ActionResult> ConfirmEmail(Guid userId, string token)
{
Task<Microsoft.AspNet.Identity.IdentityResult> result = UserManager.ConfirmEmailAsync(userId, token);
if (result.Result.Succeeded)
{
}
else
{
}
return View();
}

然后调用

public Task SetEmailConfirmedAsync(User user, bool confirmed) 
{
AccountService.VerifiyAccount(user.Id, confirmed);
return Task.FromResult(0);
}

这将帐户设置为如我所期望的那样进行验证。但是,接下来会调用FindByNameAsync,然后调用UpdateAsync方法,该方法将覆盖我在SetEmailConfirmedAsync中应用的更改。

有人知道为什么asp.net Identity在SetEmailConfirmedAsync之后调用UpdateAsync吗?我四处寻找线索,但什么也找不到。

更新

我已经做了一些挖掘,并从身份源代码中提取了这个

public virtual async Task<IdentityResult> ConfirmEmailAsync(TKey userId, string token)
{
ThrowIfDisposed();
var store = GetEmailStore();
var user = await FindByIdAsync(userId).WithCurrentCulture();
if (user == null)
{
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.UserIdNotFound,
userId));
}
if (!await VerifyUserTokenAsync(userId, "Confirmation", token).WithCurrentCulture())
{
return IdentityResult.Failed(Resources.InvalidToken);
}
await store.SetEmailConfirmedAsync(user, true).WithCurrentCulture();
return await UpdateAsync(user).WithCurrentCulture();
}

我很难弄清楚为什么在调用SetEmailConfirmedAsync之后会调用更新用户

原来我很笨,必须记住c#对象是引用类型!

而不是这个。。。

public Task SetEmailConfirmedAsync(User user, bool confirmed) 
{
AccountService.VerifiyAccount(user.Id, confirmed);
return Task.FromResult(0);
}

我只需要做这个。。。

public Task SetEmailConfirmedAsync(User user, bool confirmed)
{            
user.Verified = confirmed;
return Task.FromResult(0);
}

设置我的自定义确认字段,然后身份调用updaate方法,更新我的用户实体

public Task UpdateAsync(User user)
{
AccountService.UpdateUser(user);
return Task.FromResult(0);
}

不知道您使用的是什么版本的身份,但当前版本调用此方法:

public virtual Task SetEmailConfirmedAsync(TUser user, bool confirmed)
{
ThrowIfDisposed();
if (user == null)
{
throw new ArgumentNullException("user");
}
user.EmailConfirmed = confirmed;
return Task.FromResult(0);
}

正如您所看到的,它只在确认电子邮件的情况下设置用户,但随后需要将更改保存到数据库中,因此

return await UpdateAsync(user).WithCurrentCulture();

相关内容

  • 没有找到相关文章

最新更新