在apicontroller中无法从OwinContext获取UserManager

我正在关注Microsoft示例,以便使用Identity 2.0.0实现电子邮件validation

我被困在这个部分

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

这在controller工作,但HttpContext不包含GetOwinContext中的任何GetOwinContext方法。

所以我尝试了HttpContext.Current.GetOwinContext()GetUserManager方法不存在。

我无法find一种方法来获取我在Startup.Auth.cs中构build的UserManager

 // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 public void ConfigureAuth(IAppBuilder app) { //Configure the db context, user manager and role manager to use a single instance per request app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); ... } 

这条线

 app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

调用以下函数来configurationUserManager

 public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); //Configure validation logic for usernames manager.UserValidator = new UserValidator<ApplicationUser>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; // Configure user lockout defaults manager.UserLockoutEnabledByDefault = true; manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); manager.MaxFailedAccessAttemptsBeforeLockout = 5; manager.EmailService = new EmailService(); var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } 

我如何在ApiController访问这个UserManager

我以前真的误解了你的问题。 我想,你只是错过了一些使用陈述。

GetOwinContext().GetUserManager<ApplicationUserManager>()Microsoft.AspNet.Identity.Owin

所以请尝试添加这个部分:

 using Microsoft.AspNet.Identity.Owin; using Microsoft.AspNet.Identity; // Maybe this one too var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<User>>(); 

如果你想unit testing你的控制器,这个扩展方法可能是一个更好的解决scheme。

 using System; using System.Net.Http; using System.Web; using Microsoft.Owin; public static IOwinContext GetOwinContext(this HttpRequestMessage request) { var context = request.Properties["MS_HttpContext"] as HttpContextWrapper; if (context != null) { return HttpContextBaseExtensions.GetOwinContext(context.Request); } return null; } 

用法:

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