Ich folge einem Microsoft-Beispiel, um die E-Mail-Validierung mit Identity 2.0.0 zu implementieren
Ich stecke in diesem Teil fest
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
Dies funktioniert in ein , controller
aber HttpContext
enthält keine GetOwinContext
Methode in einem ApiController .
Also habe ich es versucht, HttpContext.Current.GetOwinContext()
aber die Methode GetUserManager
existiert nicht.
Ich kann keinen Weg finden, um das zu bekommen, was UserManager
ich in Startup.Auth.cs erstellt habe
// 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);
...
}
diese Linie
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
ruft die folgende Funktion auf, um die zu konfigurieren 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;
}
Wie kann ich UserManager
in einem darauf zugreifen ApiController
?
Antworten:
Ich habe Ihre Frage früher wirklich falsch verstanden. Sie vermissen nur einige verwendende Aussagen, denke ich.
Das
GetOwinContext().GetUserManager<ApplicationUserManager>()
ist inMicrosoft.AspNet.Identity.Owin
.Versuchen Sie also, diesen Teil hinzuzufügen:
using Microsoft.AspNet.Identity.Owin; using Microsoft.AspNet.Identity; // Maybe this one too var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<User>>();
quelle
HttpContext.Current
eine statische Eigenschaft den StromHttpContext
für den Thread zurückgibt .HttpContext
sie in einem ApiController nicht verfügbar ist. Die Verwendung der Erweiterung inSystem.Net.Http
fromSystem.Web.Http.Owin.dll
funktioniert einwandfrei über das Nuget-Plugin - nuget.org/packages/Microsoft.AspNet.WebApi.OwinDiese Erweiterungsmethode ist möglicherweise eine bessere Lösung, wenn Sie Ihre Controller einem Unit-Test unterziehen möchten.
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; }
Verwendung:
public ApplicationUserManager UserManager { get { return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); } private set { _userManager = value; } }
quelle
HttpContext.Current
eine Abhängigkeit eingeführt wirdSystem.Web
, die in selbst gehosteten Szenarien nicht verfügbar ist.Request.GetOwinContext()
wird injiziert, wodurch die Testfähigkeit ermöglicht wird. Letzteres ist weder.Request.GetOwinContext()
ist im Microsoft.AspNet.WebApi.Owin-Nuget-Paket definiertHttpContext.Current.GetOwinContext()
. Das ist viel besser.HttpContext.Current
. Sie können dann einfach schreibenRequest?.GetOwinContext()
.Diese einzelne Codezeile hat mir den Tag gerettet ...
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
Sie können es innerhalb einer Controller-Aktion verwenden, um eine Instanz von UserManager abzurufen.
quelle