Подтвердить что ты не робот

Identity 2.1 - UserId не найден, но работал до

Этот код работал до нескольких раз, но после добавления нескольких новых свойств для пользователя в Identity 2.1 он перестает работать внезапно. Я получаю ошибку UserId, не найденную, несмотря на то, что в отладчике для UserId есть значение. У кого-нибудь есть идея, почему это произошло внезапно? Это очень неприятно видеть наименьшее.

Здесь код: (Контроллер)

 // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        model.BackgroundOnFile = false;

        if (ModelState.IsValid)
        {
            var userDetails = new ApplicationUser { UserName = model.Email, Title = model.Title, Email = model.Email, FirstName = model.FirstName, LastName = model.LastName, LEAID = model.LEAID, SchoolID = model.SchoolID, Address1 = model.Address1, Address2 = model.Address2, City = model.City, State = model.State, PostCode = model.PostCode, BackgroundOnFile = model.BackgroundOnFile, BoardStart = model.BoardStart, BoardEnd = model.BoardEnd, PhoneNumber = model.PhoneNumber };
            var result = await UserManager.CreateAsync(userDetails, model.Password);


            //Assign Role
            UserManager.AddToRole(userDetails.Id, "User");

            if (result.Succeeded)
            {
                await SignInManager.SignInAsync(userDetails, 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
                // 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, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                return RedirectToAction("Index", "Home");
            }
            AddErrors(result);
        }

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

И модель:

public class ApplicationUser : IdentityUser
{

    //Extra items required to register
    public string Title { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int LEAID { get; set; }
    public int SchoolID { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    //Post Code is a string to accomodate future possible Canadian style post codes
    public string PostCode { get; set; }
    public bool BackgroundOnFile { get; set; }
    public System.DateTime BoardStart { get; set; }
    public System.DateTime BoardEnd { get; set; }
    public string NominatedBy { get; set; }


    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}

И ошибка:

UserId not found.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: UserId not found.

Source Error: 


Line 168:                
Line 169:                //Assign Role
Line 170:                UserManager.AddToRole(userDetails.Id, "User");
Line 171:
Line 172:                if (result.Succeeded)

Source File: h:\app\Controllers\AccountController.cs    Line: 170 

Stack Trace: 


[InvalidOperationException: UserId not found.]
   Microsoft.AspNet.Identity.<AddToRoleAsync>d__83.MoveNext() +871
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +24
   Microsoft.AspNet.Identity.AsyncHelper.RunSync(Func`1 func) +409
   Microsoft.AspNet.Identity.UserManagerExtensions.AddToRole(UserManager`2 manager, TKey userId, String role) +260
   UCAP.Controllers.<Register>d__7.MoveNext() in h:\Laptop Transfer\Training Code\1\CSMapAlpha3\CSMapAlpha3\Controllers\AccountController.cs:170
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
   System.Threading.Tasks.TaskHelpersExtensions.ThrowIfFaulted(Task task) +61
   System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +114
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) +66
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +117
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +323
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +44
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +72
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +185
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +39
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +39
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
   System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651688
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
4b9b3361

Ответ 1

Имея ту же ошибку прямо сейчас! Единственным актуальным недавним действием, которое я сделал, является обновление пакетов через NuGet:

  • EntityFramework 6.1.1 - 6.1.3
  • Microsoft ASP.NET IdentityCore 2.1.0to 2.2.1
  • Microsoft ASP.NET Identity EntityFramework 2.1.0 - 2.2.1
  • Microsoft ASP.NET Identity Owin 2.1.0 - 2.2.1

Все еще расследуйте...

UPDATE

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

Надеюсь, это поможет, как-то.

Ответ 2

Это исключение не генерируется классом Application User, в этом классе нет свойства с именем UserID. (его Id не UserID)

Итак, две таблицы в Identity содержат две таблицы: UserID

  • IdentityRole
  • IdentityUserRole

Поэтому исключение возникает во вставке в этих таблицах, в ApplicationUser.Id нет ничего плохого. Убедитесь, что существует роль с именем "Пользователь". также проверьте регистр имен i.e. "User"/"user"

Ответ 3

Если, как и я, вы боретесь за то, чтобы работать с личным каркасом, не полностью оценивая все входы и выходы, это может помочь. Я использовал эту строку, чтобы получить ссылку на пользователя:

var user = new ApplicationUser { UserName = ...

Это создает нового пользователя. То, что я должен был сделать, это использовать эту строку:

var user = UserManager.FindByEmail( ...

Затем вы можете reset ввести пароль следующим образом:

string code = UserManager.GeneratePasswordResetToken(user.Id);
var result = UserManager.ResetPassword(user.Id, code, model.Password);

Обратите внимание, что проверка ошибок не выполняется.