[英]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中應用的更改。
有誰知道為什么SetEmailConfirmedAsync之后asp.net Identity會調用UpdateAsync? 我已經搜索了一些線索,但是找不到任何東西。
更新
我做了一些挖掘,並將其從Identity源代碼中提取出來
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);
}
Dunno您正在使用什么版本的身份,但是當前版本使用此方法:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.