Impossible d'obtenir UserManager de OwinContext dans apicontroller

Je suis un exemple Microsoft pour implémenter la validation de messagerie avec Identity 2.0.0

Je suis coincé à cette partie

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

Cela fonctionne dans un controller, mais HttpContext ne contient pas de GetOwinContext pour un ApiController.

, Donc j'ai essayé HttpContext.Current.GetOwinContext(), mais la méthode GetUserManager n'existe pas.

Je n'arrive pas à trouver un moyen d'obtenir le démarrage UserManager que je construis dans .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); 
    ...
}

Cette ligne

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

Appelle la fonction suivante configurez le 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;
}

Comment puis-je accéder à ce UserManager dans un ApiController?

60
demandé sur Rikard 2014-06-02 22:48:06

3 réponses

J'ai vraiment mal compris votre question plus tôt. Il vous manque juste quelques déclarations d'utilisation, je pense.

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

Alors essayez d'ajouter cette partie:

using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity; // Maybe this one too

var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<User>>();
80
répondu Rikard 2016-02-16 18:06:30

Cette méthode d'extension peut être une meilleure solution si vous voulez tester vos contrôleurs par unité.

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

Utilisation:

public ApplicationUserManager UserManager
{
   get
   {
      return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
   }
   private set
   {
      _userManager = value;
   }
}
25
répondu moander 2014-09-29 22:43:16

Cette seule ligne de code a sauvé ma journée...

       var manager = 
       new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));

Vous pouvez l'utiliser dans une action de contrôleur pour obtenir une instance de UserManager.

3
répondu mubsher 2018-07-09 15:32:08