asp.net 身份 SetEmailConfirmedAsync
asp.net identity SetEmailConfirmedAsync
我的 UserStore class 中的 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?我四处寻找一些线索,但找不到任何线索。
更新
我已经做了一些挖掘并从 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 之后调用更新用户
不知道您使用的是哪个版本的身份,但当前版本调用此方法:
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();
原来是我傻了,一定要记住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);
}
设置我的自定义确认字段,然后身份调用更新我的用户实体的更新方法
public Task UpdateAsync(User user)
{
AccountService.UpdateUser(user);
return Task.FromResult(0);
}
我的 UserStore class 中的 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?我四处寻找一些线索,但找不到任何线索。
更新
我已经做了一些挖掘并从 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 之后调用更新用户
不知道您使用的是哪个版本的身份,但当前版本调用此方法:
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();
原来是我傻了,一定要记住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);
}
设置我的自定义确认字段,然后身份调用更新我的用户实体的更新方法
public Task UpdateAsync(User user)
{
AccountService.UpdateUser(user);
return Task.FromResult(0);
}