簡體   English   中英

asp.net身份SetEmailConfirmedAsync

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM