AmbiguousActionException при подтверждении электронной почты в личности - PullRequest
0 голосов
/ 26 октября 2018

Я работаю над веб-сервисом для управления регистрацией пользователей ..

Я не понимаю, потому что получаю это:

AmbiguousActionException: Несколько действий совпадают.Следующие действия соответствовали данным маршрута и удовлетворяли всем ограничениям:

Test.Api.Controllers.AccountsController.ConfirmEmail (Test.Api) Test.Api.Controllers.AccountsController.ResetPassword (Test.Api)

Это мой код

[HttpPost]
[AllowAnonymous]
[Route("register")]
public async Task<IActionResult> Register([FromBody]RegistrationViewModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var userIdentity = _mapper.Map<AppUser>(model);
    var result = await _userManager.CreateAsync(userIdentity, model.Password);

    if (!result.Succeeded) return new BadRequestObjectResult(Errors.AddErrorsToModelState(result, ModelState));

    var token = await _userManager.GenerateEmailConfirmationTokenAsync(userIdentity);
    var callbackUrl = Url.EmailConfirmationLink(userIdentity.Id, token, Request.Scheme);
    await _emailSender.SendEmailAsync(model.Email, "Confirm ",     $"Please confirm your account by clicking this link: <a href='{callbackUrl}'>link</a>");

    await _appDbContext.Customers.AddAsync(new Customer { IdentityId = userIdentity.Id, Location = model.Location });
    await _appDbContext.SaveChangesAsync();

    return new OkObjectResult("Account created");
}

Я сделал помощник для buld callbackUrl с этим кодом:

public static string EmailConfirmationLink(this IUrlHelper urlHelper, string userId, string token, string scheme)
{
    return urlHelper.Action(
        action: nameof(AccountsController.ConfirmEmail),
        controller: "Accounts",
        values: new { userId, token },
        protocol: scheme);
}

public async Task<IActionResult> ConfirmEmail(string userId, string token)
{
    if (userId == null || token == null)
    {
        return new BadRequestResult();
    }

    var user = await _userManager.FindByIdAsync(userId);
    if (user == null)
    {
        throw new ApplicationException($"Unable to load user with ID '{userId}'.");
    }
    var result = await _userManager.ConfirmEmailAsync(user, token);
    if (!result.Succeeded)
    {
        return new BadRequestResult();
    }
    await _emailSender.SendEmailAsync(user.Email, "Account confermato","Il tuo account è stato confermato");
    return new OkObjectResult("Account confirmed");
}

public IActionResult ResetPassword(string code = null)
{
    if (code == null)
    {
        throw new ApplicationException("A code must be supplied for password reset.");
    }
    var model = new ResetPasswordViewModel { Code = code };
    return View(model);
}

как это возможно, что эти два метода (ConfirmEmail (строка userId, строка token) и ResetPassword (строка code = null)) могут создать неоднозначность?два fime различны

1 Ответ

0 голосов
/ 26 октября 2018

В комментариях к вашему вопросу вы указали, что AccountsController имеет следующий атрибут:

[Route("api/[controller]")]

Это означает, что ваши действия ConfirmEmail и ResetPassword используют тот же маршрут , который в данном случае просто api/Accounts.Когда этот маршрут загружен в браузере, оба действия являются кандидатами для обработки запроса, и поэтому вы получаете сообщение об ошибке, как описано в вашем вопросе.

Чтобы исправить это, есть несколько вариантов:

  1. Добавьте [Route("ConfirmEmail")] к ConfirmEmail и [Route("ResetPassword")] к ResetPassword (аналогично тому, что вы сделали с действием Register).
  2. Добавьте [Route("[action]")] кConfirmEmail и ResetPassword, где [action] - это заполнитель для имени действия.
  3. Удалите [Route("register")] из действия Register и обновите атрибут контроллера *1030* на [Route("api/[controller]/[action]")].Вам также необходимо удалить [Route(...)] из любых других ваших действий.Обратите внимание, что этот подход жизнеспособен только в том случае, если все ваши действия маршрутизируются в соответствии с шаблоном api/[controller]/[action].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...