SetEmailConfirmedAsync

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);
}

09-20 18:47