在身份validation过程中,ApplicationSignInManager类为null

以下代码正在ASP.NET MVC 5项目中使用。 每次运行以下代码时,ApplicationSignInManager类始终为null,从而导致空引用exception。 作为一个相当新手我不明白在AccountController类的构造函数中调用什么代码调用usermanager的实例并登录管理器。 也许这就是我需要关注的地方,但事实是我无法找到代码的那一部分。 有人帮忙吗?

确切地说,从HTTPost登录方法抛出exception。 signInManager始终为null。

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); 

下面是c代码

 [Authorize] public class AccountController : Controller { private ApplicationUserManager _userManager; private ApplicationSignInManager _signInManager; public AccountController() { } public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager) { UserManager = userManager; SignInManager = signInManager; } // // GET: /Account/Login [AllowAnonymous] public ActionResult Login(string returnUrl) { ViewBag.ReturnUrl = returnUrl; return View(); } public ApplicationSignInManager SignInManager { get { return _signInManager ?? HttpContext.GetOwinContext().Get(); } private set { _signInManager = value; } } // // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { return View(model); } // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout, change to shouldLockout: true var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); switch (result) { case SignInStatus.Success: return RedirectToLocal(returnUrl); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); case SignInStatus.Failure: default: ModelState.AddModelError("", "Invalid login attempt."); return View(model); } } } 

来自IdentityConfig的代码。

 // Configure the application sign-in manager which is used in this application. public class ApplicationSignInManager : SignInManager { public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { } public override Task CreateUserIdentityAsync(ApplicationUser user) { return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); } public static ApplicationSignInManager Create(IdentityFactoryOptions options, IOwinContext context) { return new ApplicationSignInManager(context.GetUserManager(), context.Authentication); } } 

检查Identity.Config.cs的以下内容:

 public static void RegisterAuth(IAppBuilder app) { // other code app.CreatePerOwinContext(ApplicationSignInManager.Create); // other code } 

在项目的某个地方(可能是Startup.cs

 [assembly: OwinStartup(typeof(Startup), "Configuration")] namespace YourNamespace { public class Startup { public void Configuration(IAppBuilder app) { AuthConfig.RegisterAuth(app); } } } 

如果该变量总是为nulla可能存在问题

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

第一个ime _signInManager为null,所以如果HttpContext.GetOwinContext().Get()返回null,你的属性将为null,你将得到该错误。

检查HttpContext.GetOwinContext().Get()返回并确保它是一个与null不同的null