2017-01-22 10 views
0

Я видел другие вопросы в этой теме, но кажется, что я пропустил что-то, чего не могу найти из других вопросов. Возможно, это связано с RavenDb.AspNet.Identity. Во всяком случае, я не вижу, где в моем коде я ошибаюсь.CreateIdentityAsync, RavenDb.AspNet.Identity. Исключение: UserId не найден

Когда я регистрирую пользователя. Все идет хорошо, экономя IdentityUserByUserName и ApplicationUser до RavenDb. Но когда он идет на Логин пользователя по адресу await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); , что-то идет не так. и выдает ошибку: «UserId not found».

public class ApplicationUser : IdentityUser 
    { 
     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; 
     } 
    } 

     //from AccountController start 
     [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Register(RegisterViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Id = "RavenDbUsers/" + model.Email }; 

      var result = await UserManager.CreateAsync(user, model.Password); 
      await AsyncDataSession.SaveChangesAsync(); 

      if (result.Succeeded) 
      { 
       await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 

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

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


    public class ApplicationSignInManager : SignInManager<ApplicationUser, string> 
    { 
     public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) 
      : base(userManager, authenticationManager) 
     { 
     } 

     public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user) 
     { 
      return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); 
     } 

     public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context) 
     { 
      return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication); 
     } 
    } 

UPDATE:

// т е р, SingInManager, UserManager Контроллера

 private ApplicationSignInManager _signInManager; 
    private UserManager<ApplicationUser> _userManager; 

    public AccountController() 
    { 
     _userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(() => AsyncDataSession)); 
    } 

    public ApplicationSignInManager SignInManager 
    { 
     get 
     { 
      return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); 
     } 
     private set 
     { 
      _signInManager = value; 
     } 
    } 

    public UserManager<ApplicationUser> UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

// UPDATE: ApplicationUserManager

public class ApplicationUserManager : UserManager<ApplicationUser> 
    { 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) 
      : base(store) 
    { 
    } 

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var session = context.Get<IAsyncDocumentSession>(); 
     session.Advanced.UseOptimisticConcurrency = true; 

     var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(session)); 
     manager.UserValidator = new UserValidator<ApplicationUser>(manager) 
     { 
      AllowOnlyAlphanumericUserNames = false, 
      RequireUniqueEmail = true 
     }; 

     manager.PasswordValidator = new PasswordValidator 
     { 
      RequiredLength = 6, 
      RequireNonLetterOrDigit = true, 
      RequireDigit = true, 
      RequireLowercase = true, 
      RequireUppercase = true, 
     }; 

     manager.UserLockoutEnabledByDefault = true; 
     manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); 
     manager.MaxFailedAccessAttemptsBeforeLockout = 5; 

     manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider<ApplicationUser> 
     { 
      MessageFormat = "Your security code is {0}" 
     }); 
     manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider<ApplicationUser> 
     { 
      Subject = "Security Code", 
      BodyFormat = "Your security code is {0}" 
     }); 
     manager.EmailService = new EmailService(); 
     manager.SmsService = new SmsService(); 
     var dataProtectionProvider = options.DataProtectionProvider; 
     if (dataProtectionProvider != null) 
     { 
      manager.UserTokenProvider = 
        new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")); 
     } 
     return manager; 
    } 
+0

Вы выяснили, проблема? Просто после нашего разговора на этой неделе. –

+1

Да, я, наконец, сделал! В строке «var result = wait UserManager.CreateAsync» в контроллере пользователь был сохранен в db. Но я думаю, что, как вы сказали, мой UserManager и SignInManager использовали разные сеансы. Поэтому после этой строки мне пришлось вручную сохранить и сохранить пользователя, используя сессию контроллера базового ворона. Тогда SignInManager может найти пользователя в db (тот же сеанс). Поэтому я думаю, что это была ошибка со мной ... Большое спасибо за помощь и код, которым вы поделились. Это помогло мне найти проблему. – user3228992

+0

Рад помочь. Не стесняйтесь обращаться к нам, если у вас есть проблемы с RavenDB Identity. Я @judahgabriel в Twitter. –

ответ

1

Автор RavenDB.AspNet.Identity здесь.

Когда вы добираетесь до этой строки, каково значение user.Id?

await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); 

Кроме того, вы можете проверить, действительно ли пользователь существует в базе данных до того, как этот код будет выполнен?

Мои психические навыки отладки говорят мне, что ваш UserManager может использовать другой IAsyncDocumentSession, чем accountController.AsyncDataSession, и, таким образом, пользователь не находится в базе данных при вызове SignInAsync.

+0

Привет! Когда я добираюсь до этой строки, user.Id - это то, что я ей назначил (например, «RavenDbUsers/[email protected]»). Я также могу проверить, существует ли пользователь в db. Кстати, спасибо за отличный проект! Но я не знаю, что делать на самом деле ... что-то в моей реализации должно быть неправильным ... – user3228992

+0

Просто для подтверждения, пользователь существует в БД * до того, как * SignInAsync фактически выполнен, да? –

+0

В этот момент я вижу пользователя, созданного в RavenStudio. Так что да, я думаю ... – user3228992