无法从apicontroller中的OwinContext获取UserManager


70

我正在跟踪一个Microsoft示例,以使用Identity 2.0.0实现电子邮件验证。

我被困在这部分

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

这可以在ApiController中工作,controllerHttpContext不包含任何GetOwinContext方法。

所以我尝试了,HttpContext.Current.GetOwinContext()但是该方法GetUserManager不存在。

我找不到UserManagerStartup.Auth.cs中构建I的方法

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

调用以下函数来配置 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;
}

如何UserManager在中访问此内容ApiController


您是否使用任何DI框架?
里卡德2014年

您的ApiController中不存在GetOwinContext()是什么意思?它是空还是空?
里卡德2014年

抱歉。该方法不存在
2014年

看我更新的答案。
里卡德

Answers:


88

我真的误会了您的问题。我认为您只是缺少一些using语句。

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>>();

1
那是我曾经做过的,但是我在create函数中添加的选项不存在。
2014年

7
整体使用起来更安全吗:System.Web.HttpContext.Current.Request.GetOwinContext()。GetUserManager ....
Robert Achmann 2014年

1
@RobertAchmann我看不到为什么它应该更安全甚至更好,因为它HttpContext.Current是一个静态属性,返回HttpContext线程的当前值。
里卡德

1
这个答案实际上并不能回答问题,因为HttpContext在ApiController中是无法访问的。使用在扩展System.Net.Http,从System.Web.Http.Owin.dll 从的NuGet插件工作正常- nuget.org/packages/Microsoft.AspNet.WebApi.Owin
达恩·理查森

28

如果要对控制器进行单元测试,则此扩展方法可能是更好的解决方案。

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

1
这是更好的答案,应该被接受。不依赖于HttpContext.Current。
MPavlak '16

3
我完全同意,HttpContext.Current引入了对的依赖System.Web,这在自托管方案中不可用。 Request.GetOwinContext()注入,因此允许测试能力。后者都不是。
Chef_Code

6
BTW ...Request.GetOwinContext()是在Microsoft.AspNet.WebApi.Owin nuget包中定义的
Chef_Code

这有助于我避免在使用时抛出的异常HttpContext.Current.GetOwinContext()。这样好多了。
petrosmm '18年

同意这是更好的答案,因为它避免了周围的潜在异常问题HttpContext.Current。然后就可以写了Request?.GetOwinContext()
ScottB

6

这行代码节省了我的时间...

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

您可以在控制器操作中使用它来获取UserManager的实例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.