Cannot get UserManager from OwinContext in apicontroller

I am following Microsoft's example to do email validation using Identity 2.0.0

I'm stuck in this part

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

This works in the controller , but the HttpContext does not contain any GetOwinContext method in ApiController .

So, I tried HttpContext.Current.GetOwinContext() , but the GetUserManager method GetUserManager not exist.

I cannot figure out how to get the UserManager that I create in Startup.Auth.cs

 // 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); ... } 

this line

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

calls the following function to configure UserManager

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

How can I access this UserManager in ApiController ?

+54
c # asp.net-web-api asp.net-identity owin
Jun 02 '14 at 18:48
source share
2 answers

I really misunderstood your question before. I just think you are just not using some statements.

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

So try adding this part:

 using Microsoft.AspNet.Identity.Owin; using Microsoft.AspNet.Identity; // Maybe this one too var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<User>>(); 
+74
Jun 02 '14 at 19:50
source share

This extension method may be the best solution if you want to unit test your controllers.

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

Using:

 public ApplicationUserManager UserManager { get { return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); } private set { _userManager = value; } } 
+21
Sep 29 '14 at 22:43
source share



All Articles