2017-02-15 14 views
0

У меня есть два веб-сайта с использованием одной базы данных, я использую идентификатор asp.net (2.2.1.40403), и у меня есть проблема, которую я не могу понять. Теперь это уже третий раз, и я не знаю, где проблема.MVC 5 Идентификатор ASP.NET - CreateAsync неверный идентификатор пользователя

У меня есть регистр и отправить метод электронной почты как этот

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Register(RegisterViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = new User { UserName = model.Email, Email = model.Email, RegisterDate = DateTime.Now }; 
     var result = await UserManager.CreateAsync(user, model.Password); 
     if (result.Succeeded) 
     { 
      //await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 

      // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
      await SendConfirmationEmail(user); 

      return View("ConfirmationEmailSent"); 
     } 
     AddErrors(result); 
    } 

    // If we got this far, something failed, redisplay form 
    return View(model); 
} 

private async Task SendConfirmationEmail(Dal.Models.User user) 
{ 
    // Send an email with this link 
    string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 

    var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
    await UserManager.SendEmailAsync(user.Id, "Potvrzení Vašeho účtu", "Prosím potvrďte svou emailovou adresu kliknutím <a href=\"" + callbackUrl + "\">zde</a>."); 
} 

Что случилось, что, когда пользователь зарегистрирован он получил URL, когда идентификатор пользователя был установлен в 3d847c51-7217-49fe-ae9d-d8e46e291559, но в базе данных пользователь был создан с 95789d6e-b66e-4c9e-8ee4-fe384b82e838. Я не понимаю, как это может произойти. Кстати, в базе данных нет Id 3d847c51-7217-49fe-ae9d-d8e46e291559. Вы не знаете, почему и как это может произойти?

+0

Что произойдет, если вы специально запрос для одного пользователя по его имени пользователя вместо того, чтобы с помощью вновь созданного 'user'? – kat1330

+0

Я реализовал это сейчас, это происходит однозначно, поэтому я не могу имитировать его. Не знаю, ожидая журнала. – Teamol

ответ

1

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

//...other code removed for brevity 

var user = new User { UserName = model.Email, Email = model.Email, RegisterDate = DateTime.Now }; 
var result = await UserManager.CreateAsync(user, model.Password); 
if (result.Succeeded) 
{ 
    //pick one 
    //user = await UserManager.FindById(user.Id); 
    //user = await UserManager.FindByName(user.UserName); 
    user = await UserManager.FindByEmailAsync(user.Email); 

    // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
    await SendConfirmationEmail(user); 

    return View("ConfirmationEmailSent"); 
} 
AddErrors(result); 

//...other код удален для краткости

+0

Привет, спасибо за ваш ответ. Я понимаю, что я могу сделать такой подход, но я хотел бы понять, как это возможно. – Teamol

+1

@Teamol, На этом этапе в жизни этой структуры я могу только предположить, что это была ошибка в этой версии. Возможно, это может быть связано с реализацией async. Придется взглянуть на исходный код для этой версии. Обнаружена проблема создания асинхронного вызова в неправильном порядке https://aspnetidentity.codeplex.com/workitem/2518 – Nkosi

0

Я также подозреваю, что проблема связана с UserManager.CreateAsync() методом. Вы используете правильно. Я предпочел бы использовать созданный вручную идентификатор пользователя вместо UserManager.

В вашем случае будет:

var user = new User { UserName = model.Email, Email = model.Email, RegisterDate = DateTime.Now }; 
    user.Id = Guid.NewGuid().ToString(); 
    var result = await UserManager.CreateAsync(user, model.Password); 
    if (result.Succeeded) 
    {    
     await SendConfirmationEmail(user); 

     return View("ConfirmationEmailSent"); 
    }