c# - parte - No se puede obtener el UserManager desde OwinContext en el controlador
identity server 4 ejemplos (3)
Esta única línea de código me salvó el día ...
var manager =
new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
Puede usarlo dentro de una acción de controlador para obtener una instancia de UserManager.
Estoy siguiendo una muestra de Microsoft para implementar la validación de correo electrónico con Identity 2.0.0
Estoy atrapado en esta parte
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
Esto funciona en un controller
pero HttpContext
no contiene ningún método GetOwinContext
en un ApiController .
Así que probé HttpContext.Current.GetOwinContext()
pero el método GetUserManager
no existe.
No puedo encontrar una manera de obtener el UserManager
que construyo en 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);
...
}
esta línea
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
llama a la siguiente función para configurar el 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;
}
¿Cómo puedo acceder a este UserManager
en un ApiController
?
Este método de extensión puede ser una mejor solución si desea probar sus controladores por unidades.
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;
}
Uso:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
Realmente malentendí tu pregunta antes. Simplemente te faltan algunas declaraciones de uso, creo.
GetOwinContext().GetUserManager<ApplicationUserManager>()
está en Microsoft.AspNet.Identity.Owin
.
Intenta agregar esta parte:
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity; // Maybe this one too
var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<User>>();