【问题标题】:asp.net identity SetEmailConfirmedAsyncasp.net 标识 SetEmailConfirmedAsync
【发布时间】:2015-06-16 09:47:55
【问题描述】:

我的 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# asp.net asp.net-mvc asp.net-identity


    【解决方案1】:

    原来我很笨,一定要记住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);
    }
    

    【讨论】:

    • 请将此标记为答案,以便在人们阅读您的问题时首先显示出来。另一个答案充其量是令人困惑的,不能回答问题。
    【解决方案2】:

    不知道你用的是什么版本的身份,但是当前版本调用这个方法:

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

    【讨论】:

    • 来自哪个版本的 Identity?我的代码 sn-p 来自 aspnetidentity.codeplex.com 上的最新版本
    • 从最新版本开始,2.2.1 从 4 月 4 日开始。
    猜你喜欢
    • 2013-07-12
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多