为什么UserManager.ConfirmEmailAsync引发无效用户?

问题描述:

鉴于我的代码在ConfirmEmail为什么UserManager.ConfirmEmailAsync引发无效用户?

var result = await UserManager.ConfirmEmailAsync(userId, code); 
if (result.Succeeded) 
{ 
    model.Message = "Thank you for confirming your email."; 
    model.IsConfirmed = true; 
    return View(model); 
} 

从标准的MVC 5项目模板的代码紧密依托,我希望一个无效的用户造成result.Succeeded == false,不要有ConfirmEmailAsync抛出InvalidOperationException

+1

我同意你的意见。如果用户没有找到,那么我们需要捕捉异常并自己处理,因为框架没有。 – forwheeler

UserManager.ConfirmEmailAsync的源代码是:

public virtual async Task<IdentityResult> ConfirmEmailAsync(TKey userId, string token) 
{ 
    ThrowIfDisposed(); 
    var store = GetEmailStore(); 
    var user = await FindByIdAsync(userId).ConfigureAwait(false); 
    if (user == null) 
    { 
     throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.UserIdNotFound, userId)); 
    } 
    if (!await VerifyUserTokenAsync(userId, "Confirmation", token)) 
    { 
     return IdentityResult.Failed(Resources.InvalidToken); 
    } 
    await store.SetEmailConfirmedAsync(user, true).ConfigureAwait(false); 
    return await UpdateAsync(user).ConfigureAwait(false); 
} 

你可以看到,当使用FindByIdAsync(userId)未找到用户InvalidOperationException被抛出。

所以这种行为是有意设计的。

+2

不错 - OP可以总是覆盖这个方法来获得他想要的功能。 – heymega