Identity UpdateAsync丢失IdentityResult.失败



我为ASP.NET Identity编写了一个自定义UserStore,我正在ASP.NET MVC 5.1应用程序中使用它。一切都按预期进行,我对ASP.NET的这个新功能(身份)感到非常高兴…

问题是,我想距离我试图从UpdateAsync方法返回错误已经近2天了,但不知怎么的,我似乎无法返回任何内容。

LE:我使用的是ASP.NET Identity Core 2.0.0-beta1

这是我的几行代码:

public Task UpdateAsync(IdentityUser user)
{
AdminUserEntity userEntity = new AdminUserEntity();
userEntity.IsNew = false;
userEntity.Id = user.UserModel.Id;
userEntity.UserCompleteName = user.UserModel.UserCompleteName;
userEntity.IsDisabled = user.UserModel.IsDisabled;
if (!String.IsNullOrEmpty(user.UserModel.PasswordHash))
userEntity.PasswordHash = user.UserModel.PasswordHash;
if (user.Claims != null && user.Claims.Count > 0)
{
foreach (Claim claim in user.Claims)
{
AdminUserClaimEntity claimEntity = userEntity.AdminUserClaims.AddNew();
claimEntity.AdminUserUniqueId = user.UserModel.UniqueId;
claimEntity.ClaimType = claim.Type;
claimEntity.ClaimValue = claim.Value;
}
}
try
{
byte[] timestamp = Convert.FromBase64String(user.UserModel.Timestamp);
AdminUserEntityManagement.UpdateCompleteAdminUserEntity(userEntity, timestamp);
}
catch (Exception exception)
{
List<string> errors = new List<string>() {exception.Message};
return Task.FromResult<IdentityResult>(IdentityResult.Failed(errors.ToArray()));
}
return Task.FromResult<object>(null);
}

尽管有一个异常并且catch块正在执行,但下面的行总是返回成功:

IdentityResult result = await UserManager.UpdateAsync(identityUser);

有人能告诉我我缺了什么吗?

我假设这个UpdateAsync在ApplicationUserManager类中,签名不应该是吗

public override Task<IdentityResult> UpdateAsync 

如果您试图更改UserManager的UpdateAsync方法的工作方式。

首先,@好功,谢谢你的帮助。现在我可以说我看到了大局。虽然我不能说我喜欢它,但我理解UserManager是如何工作的。

此外,如果你认为我说错了什么,请纠正我。

对于其他人,为了自定义UserManager行为(即使你只是想显示一个错误,你无论如何都可以在UserStore自定义类中捕捉到),你必须遵循以下步骤(为了更好地理解,我将通过描述我为UpdateAsync方法捕捉业务异常并在界面中显示它所做的工作来举例说明):

  1. 在UserStore类(应该在其他接口中实现IUserStore接口)中,不要捕获任何异常。

    public Task UpdateAsync(IdentityUser user)
    {
    // here an exception will be thrown if there is a concurrency issue
    byte[] timestamp = Convert.FromBase64String(user.UserModel.Timestamp);
    AdminUserEntityManagement.UpdateCompleteAdminUserEntity(userEntity, timestamp);
    return Task.FromResult<object>(null);
    }
    
  2. 扩展UserManager类并覆盖您想要自定义的方法(捕获之前抛出的业务异常并将其显示到接口):

    public class AdminUserManager : UserManager<IdentityUser>
    
    public override async Task<IdentityResult> UpdateAsync(IdentityUser user)
    {
    Task<IdentityResult> result = base.UpdateAsync(user);
    try
    {
    IdentityResult identityResult = await result;
    }
    catch (Exception exception)
    {
    List<string> errors = new List<string>() { exception.Message };
    return IdentityResult.Failed(errors.ToArray());
    }
    return result.Result;
    }
    
  3. 在MVC控制器中(例如)从扩展的UserManager类读取UpdateAsync方法的结果:

    IdentityResult result = await UserManager.UpdateAsync(identityUser);
    if (result.Succeeded)
    {
    this.SetNotification("The user has been updated.", EnumToastrNotificationType.Info);
    return RedirectToAction("ShowUsers", "UserManagement");
    }
    else
    {
    this.AddErrors(result);
    }
    

相关内容

  • 没有找到相关文章

最新更新