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