Я видел другие вопросы в этой теме, но кажется, что я пропустил что-то, чего не могу найти из других вопросов. Возможно, это связано с 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;
}
Вы выяснили, проблема? Просто после нашего разговора на этой неделе. –
Да, я, наконец, сделал! В строке «var result = wait UserManager.CreateAsync» в контроллере пользователь был сохранен в db. Но я думаю, что, как вы сказали, мой UserManager и SignInManager использовали разные сеансы. Поэтому после этой строки мне пришлось вручную сохранить и сохранить пользователя, используя сессию контроллера базового ворона. Тогда SignInManager может найти пользователя в db (тот же сеанс). Поэтому я думаю, что это была ошибка со мной ... Большое спасибо за помощь и код, которым вы поделились. Это помогло мне найти проблему. – user3228992
Рад помочь. Не стесняйтесь обращаться к нам, если у вас есть проблемы с RavenDB Identity. Я @judahgabriel в Twitter. –