首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在应用程序中无法从OwinContext获取UserManager

在应用程序中无法从OwinContext获取UserManager
EN

Stack Overflow用户
提问于 2014-06-03 02:48:06
回答 3查看 69.9K关注 0票数 70

我遵循Microsoft示例,使用Identity 2.0.0实现电子邮件验证

我被困在这部分了

代码语言:javascript
复制
public ApplicationUserManager UserManager
{
   get
   {
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
   }
   private set
   {
      _userManager = value;
   }
}

这在ApiController.中有效,但HttpContext中不包含任何GetOwinContext方法

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

我想不出一种方法来获得我在Startup.Auth.cs中构建的UserManager

代码语言:javascript
复制
// 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); 
    ...
}

这一行

代码语言:javascript
复制
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

调用以下函数来配置UserManager

代码语言:javascript
复制
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;
}

如何在ApiController中访问此UserManager

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-03 03:50:03

我之前真的误解了你的问题。我认为你只是遗漏了一些using语句。

GetOwinContext().GetUserManager<ApplicationUserManager>()Microsoft.AspNet.Identity.Owin中。

所以试着添加这个部分:

代码语言:javascript
复制
using Microsoft.AspNet.Identity.Owin;
using Microsoft.AspNet.Identity; // Maybe this one too

var manager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager<User>>();
票数 90
EN

Stack Overflow用户

发布于 2014-09-30 06:43:16

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

代码语言:javascript
复制
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;
}

用法:

代码语言:javascript
复制
public ApplicationUserManager UserManager
{
   get
   {
      return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
   }
   private set
   {
      _userManager = value;
   }
}
票数 28
EN

Stack Overflow用户

发布于 2018-07-09 23:32:09

这一行代码拯救了我的一天。

代码语言:javascript
复制
       var manager = 
       new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24001245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档