我为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方法捕捉业务异常并在界面中显示它所做的工作来举例说明):
-
在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); }
-
扩展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; }
-
在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); }