.NET Core 2 Identity CreateAsync Обнаружение ошибок

Я получаю сообщение об ошибке при попытке CreateAsync пользователя.

var create = await _userManager.CreateAsync(user, model.Password);

Есть свойство, к которому я могу получить доступ на IdentityResult под названием errors. Однако я не могу понять, как получить к нему доступ. Любая идея, как я могу поймать его, чтобы увидеть, в чем он ошибается?

Я разместил полный код контроллера ниже. По какой-то причине всякий раз, когда я пытаюсь что-то сделать с моим var create, он просто игнорирует его. Я не могу даже шагнуть в него.

namespace TechsportiseOnline.Controllers
{
    [Produces("application/json")]
    [Route("api/[controller]/[action]")]
    public class RegistrationController : Controller
    {
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly SignInManager<ApplicationUser> _signInManager;
        private readonly IConfiguration _configuration;
        private readonly IOptions<JWTSettings> _jwtConfig;
        private readonly IEmailSender _emailSender;

        public RegistrationController(
              UserManager<ApplicationUser> userManager,
              SignInManager<ApplicationUser> signInManager,
              IConfiguration configuration,
              IOptions<JWTSettings> jwtConfig,
              IEmailSender emailSender)
                    {
                        _userManager = userManager;
                        _signInManager = signInManager;
                        _configuration = configuration;
                        _jwtConfig = jwtConfig;
                        _emailSender = emailSender;

        }

        [AllowAnonymous]
        [HttpPost]
        public async Task<IActionResult> Register([FromBody] RegisterModel model)
        {
            if (ModelState.IsValid)
            {

                var user = new ApplicationUser
                {
                    UserName = model.Email,
                    Email = model.Email,
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    MobileNumber = model.MobileNumber,
                    Marketing = model.Marketing,
                    Newsletter = model.Newsletter
                };

                var result = new CreateUserResult();

                var    create = await _userManager.CreateAsync(user, model.Password);




                if (create.Succeeded == true)
                {

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
                    var callbackUrl = Url.EmailConfirmationLink(user.Id, code.ToString(), Request.Scheme);
                    await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);


                    //await _createContact.CreateContactAsync(model.Email, model.FirstName, model.LastName, model.Marketing, model.Newsletter);
                    var fields = new Dictionary<string, string>();
                    fields.Add("firstname", model.FirstName);
                    fields.Add("lastname", model.LastName);
                    fields.Add("newsletter", model.Newsletter.ToString());
                    fields.Add("marketing", model.Marketing.ToString());
                    string publicaccountid = "55ebcc8b-b23f-4843-9dcb-1df08811de65";
                    var createcontact = ElasticEmailClient.Api.Contact.AddAsync(publicAccountID: publicaccountid, email: model.Email, field: fields);



                    //await _signInManager.SignInAsync(user, isPersistent: false);
                    return CreatedAtRoute("CreateAccount", model);
                }
                else
                {
                    return BadRequest("Could not register account");
                }
            }
            else
            {
                return BadRequest("The model is invalid");
            }
        }       
    }


}

person Matthew Warr    schedule 18.10.2017    source источник


Ответы (2)


Это мой пример кода: я использую MediatR, чтобы (попытаться) разделить запросы и команды.

СоздатьUserByAdminHandler

public class CreateUserByAdminHandler : IAsyncRequestHandler<CreateUserByAdmin, CreateUserResult>
{
    private readonly UserManager<AppUser> _userManager;

    public CreateUserByAdminHandler(UserManager<AppUser> userManager)
    {
        _userManager = userManager;
    }

    public async Task<CreateUserResult> Handle(CreateUserByAdmin command)
    {
        var result = new CreateUserResult();

        try
        {
            var appUser = new AppUser
            {
                UserName = command.Username.Trim(),
                FirstName = command.FirstName.Trim(),
                LastName = command.LastName.Trim(),
                Email = command.Email,
                PhoneNumber = command.PhoneNumber,
                Status = UserStatus.Active
            };

            var createResult = await _userManager.CreateAsync(appUser, command.Password);
            if (!createResult.Succeeded)
            {
                // IdentityResult has Errors property, which is a list of 
                // IdentityError. IdentityError has Code and Description
                // property. It's up to you to select whichever property 
                // for the error message.

                result.AddErrors(createResult.Errors.Select(ier => ier.Description));
                return result;
            }

            result.NewUser = appUser;
        }
        catch (Exception ex)
        {
            result.SetException(ex);
        }

        return result;
    }
}
person David Liang    schedule 18.10.2017
comment
Я пытался использовать аналогичную логику, но проблема в том, что если я попытаюсь разместить какой-либо оператор if, относящийся к моему var create (var createResult в вашем примере), он проигнорирует его и перейдет к следующему оператору... I; я обновил мой вопрос, включив в него весь код контроллера. - person Matthew Warr; 18.10.2017
comment
он игнорирует его и переходит к следующему оператору: вы имели в виду, что create.Succeeded является ложным, поэтому он переходит к следующему оператору? Или программа просто висит там? Вы проверили, является ли ваш _userManager NULL, и есть ли какие-либо исключения? - person David Liang; 18.10.2017
comment
Я поставил точку останова на CreateAsync line. Приложение останавливается там. Если я либо перешагну, либо перешагну, он перейдет прямо к возврату BadRequest("Could not register account"); и никогда не дойдет до оператора if. Никаких исключений, которые я вижу, - если я поставлю вокруг него try/catch, он будет вести себя так же. Вот этого я не понимаю. - person Matthew Warr; 18.10.2017
comment
Похоже, есть проблема с вашей настройкой удостоверения ASP.NET. - person David Liang; 18.10.2017
comment
Я бы согласился, если бы это не работало нормально в части приложения MVC. Я добавил этот контроллер для создания пользователя через вызов API (который я хочу сделать через приложение Xamarin). Делать это через MVC нормально. Здесь та же логика = ошибка. - person Matthew Warr; 18.10.2017

Установите точку останова на if (create.Succeeded == true) и проверьте объект создания или добавьте оператор else для чтения ошибок. Вот код, который я использую для регистрации своих ошибок.

var result = await _userManager.CreateAsync(newUser, "Password123!");

if (result.Succeeded)
{
   //do stuff
}
                
foreach (var error in result.Errors)
{
   _logger.LogWarning("Code: " + error.Code + " " + error.Description);
}
person Bridget Arrington    schedule 08.09.2020