HttpContext.GetOwinContext()。GetUserManager ()返回null

我使用ASP.NET Identity 2来创建角色但是HttpContext.GetOwinContext().GetUserManager()的结果HttpContext.GetOwinContext().GetUserManager()为null。

然后我无法创建角色。

我怎么解决这个问题?

 public class MVCController : Controller { public MVCController() { } public AppRoleManager RoleManager // returns null ?! { get { return HttpContext.GetOwinContext().GetUserManager(); } } public User CurrentUser { get { string currentUserId = User.Identity.GetUserId(); User currentUser = DataContextFactory.GetDataContext().Users.FirstOrDefault(x => x.Id.ToString() == currentUserId); return currentUser; } } public IAuthenticationManager AuthManager { get { return HttpContext.GetOwinContext().Authentication; } } public AppUserManager UserManager { get { return HttpContext.GetOwinContext().GetUserManager(); } } } 

我的控制器:

 public class RoleAdminController : MVCController { [HttpPost] public async Task CreateRole([Required]string name) { if (ModelState.IsValid) { if (RoleManager != null) // RoleManager is null, why?! { IdentityResult result = await RoleManager.CreateAsync(new Role { Name = name }); if (result.Succeeded) { return RedirectToAction("Index"); } else { AddErrorsFromResult(result); } } } return View(name); } } 

AppRoleManager:

 public class AppRoleManager : RoleManager, IDisposable { public AppRoleManager(RoleStore store) : base(store) { } public static AppRoleManager Create(IdentityFactoryOptions options, IOwinContext context) { return new AppRoleManager(new RoleStore(DataContextFactory.GetDataContext())); } } 

很可能你错过了给OwinContext创建ApplicationUserManager的方法。
为此你需要在你的public void Configuration(IAppBuilder app)有这些

 app.CreatePerOwinContext(ApplicationUserManager.Create); app.CreatePerOwinContext(AppRoleManager.Create); 

这将注册使用OwinContext创建UserManagerRoleManagerOwinContext然后只能在控制器中调用它们。

我知道这是旧post,但我想与其他人分享我的研究,对于这个问题,我创建了部分类并在那里添加我所有的owin引用:

 public partial class Startup { public void ConfigureAuth(IAppBuilder app) { // Configure the db context, user manager and signin manager to use a single instance per request app.CreatePerOwinContext(IdentityModels.Create); app.CreatePerOwinContext(ApplicationUserManager.Create); app.CreatePerOwinContext(ApplicationSignInManager.Create); app.CreatePerOwinContext(AppRoleManager.Create); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { // Enables the application to validate the security stamp when the user logs in. // This is a security feature which is used when you change a password or add an external login to your account. OnValidateIdentity = SecurityStampValidator.OnValidateIdentity( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); } } 

然后我在其他部分启动中使用此方法:

  public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); } } 
Interesting Posts