在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; } }