c# - asp.net 身份 SetEmailConfirmedAsync

标签 c# asp.net asp.net-mvc asp.net-identity

我的 UserStore 类中的 SetEmailConfirmedAsync 方法遇到问题。

一切正常,正在使用散列密码创建用户,正在为确认电子邮件生成 token ,电子邮件发送成功。当我尝试验证电子邮件时出现问题

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 后会调用更新用户

最佳答案

事实证明我很愚蠢,必须记住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);
}

关于c# - asp.net 身份 SetEmailConfirmedAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29565425/

相关文章:

c# - F# 2.0 中的错误与泛型类型参数的约束在哪里有关?

c# - 在 linq 中选择总小时数

c# - 多次使用 C# 比较 2 个巨大的列表(有一个转折点)

asp.net - Bad Request 是哪个系统异常

c# - 如何防止根据条件执行 Controller 操作?

c# - EntityFramework - 实体代理错误

asp.net - 使用 Web.config 重写的 Url 不适用于 IIS Express

asp.net - 有任何 SQL Server 多记录集存储过程陷阱吗?

c# - 您可以根据 Controller 操作的参数在 asp.net-mvc 中使用输出缓存吗

c# - ASP.NET MVC 5.1 C# OWIN facebook 身份验证或登录要求生日、喜欢、公共(public)资料、电话号码