C# 在新控制器中访问ApplicationUserManager和ApplicationSigningManager

C# 在新控制器中访问ApplicationUserManager和ApplicationSigningManager,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我正在尝试在ASP.NET MVC 5中的新控制器中访问ApplicationUserManager和ApplicationSignInManager。我读过很多类似的帖子,但看不出我做错了什么 1.添加新控制器(MVC 5控制器为空) 2.添加类似于AccountController和ManagerController的构造函数以传递ApplicationUserManager和ApplicationSigningManager 示例控制器如下所示 using System; using Sy

我正在尝试在ASP.NET MVC 5中的新控制器中访问
ApplicationUserManager
ApplicationSignInManager
。我读过很多类似的帖子,但看不出我做错了什么

1.添加新控制器(MVC 5控制器为空)

2.添加类似于AccountController和ManagerController的构造函数以传递
ApplicationUserManager
ApplicationSigningManager

示例控制器如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;

namespace IR.Controllers
{
    [Authorize(Roles = "Administrator")]
    public class AdminController : Controller
    {
        private ApplicationSignInManager _signInManager;
        private ApplicationUserManager _userManager;

        public AdminController()
        {
        }

        public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
        {
            UserManager = userManager;
            SignInManager = signInManager;
        }

        public ApplicationSignInManager SignInManager
        {
            get
            {
                return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
            }
            private set
            {
                _signInManager = value;
            }
        }

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

        // GET: Default
        public ActionResult Index()
        {
            var user = _userManager.FindByNameAsync("email@email.com");
            return View();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.Mvc;
使用Microsoft.AspNet.Identity;
使用Microsoft.AspNet.Identity.Owin;
使用Microsoft.Owin.Security;
命名空间IR.Controller
{
[授权(角色=“管理员”)]
公共类AdminController:Controller
{
专用应用程序signInManager\u signInManager;
私有应用程序用户管理器\u用户管理器;
公共行政总监()
{
}
公共管理员控制器(ApplicationUserManager用户管理器、ApplicationSignInManager signInManager)
{
UserManager=UserManager;
SignInManager=SignInManager;
}
公共应用程序SignInManager SignInManager
{
得到
{
return _signInManager??HttpContext.GetOwinContext().Get();
}
专用设备
{
_signInManager=值;
}
}
公共应用程序管理员用户管理器
{
得到
{
返回_userManager??HttpContext.GetOwinContext().GetUserManager();
}
专用设备
{
_userManager=value;
}
}
//获取:默认值
公共行动结果索引()
{
var user=\u userManager.FindByNameAsync(“email@email.com");
返回视图();
}
}
}
但是,只调用空构造函数,
var user=\u userManager.FindByNameAsync(“email@email.com");失败,因为
\u userManager==null


我遗漏了什么?

我现在意识到这是一个老问题,但对于那些带着同样问题来到这里的人,这里有一个答案

上面管理者的代码是MVC5模板的标准实现代码,用于带有单个用户帐户的项目集。这两个管理器的实现方式相同,因此我们将继续关注这里讨论的
applicationsermanager
,但它也适用于
applicationSigningManager

ApplicationUserManager
被实现为具有私有支持字段的公共属性-
private ApplicationUserManager\u userManager
backing字段用于保存属性的状态,因此不用于直接在调用代码中使用。这就是公共属性
UserManager
的用途。 那么,如何将此属性设置为返回
ApplicationUserManager
类的实例而不是null

有两种解决方案。一种是通过重载构造函数实例化
AdminController
类:

public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
        {
            UserManager = userManager;
            SignInManager = signInManager;
        }
但我会说,只有在一些边缘情况下,你才会这么做。在大多数情况下,控制器类由http请求实例化。实际上可以删除此构造函数,因为该解决方案已在属性的getter中实现:

return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
此行将
ApplicationUserManager
存储在文本中

    // Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
因此,上述问题的答案是,使用UserManager-而不是UserManager

var user = UserManager.FindByNameAsync("email@email.com");

我现在意识到这是一个老问题,但对于那些带着同样问题来到这里的人,这里有一个答案

上面管理者的代码是MVC5模板的标准实现代码,用于带有单个用户帐户的项目集。这两个管理器的实现方式相同,因此我们将继续关注这里讨论的
applicationsermanager
,但它也适用于
applicationSigningManager

ApplicationUserManager
被实现为具有私有支持字段的公共属性-
private ApplicationUserManager\u userManager
backing字段用于保存属性的状态,因此不用于直接在调用代码中使用。这就是公共属性
UserManager
的用途。 那么,如何将此属性设置为返回
ApplicationUserManager
类的实例而不是null

有两种解决方案。一种是通过重载构造函数实例化
AdminController
类:

public AdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
        {
            UserManager = userManager;
            SignInManager = signInManager;
        }
但我会说,只有在一些边缘情况下,你才会这么做。在大多数情况下,控制器类由http请求实例化。实际上可以删除此构造函数,因为该解决方案已在属性的getter中实现:

return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
此行将
ApplicationUserManager
存储在文本中

    // Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
因此,上述问题的答案是,使用UserManager-而不是UserManager

var user = UserManager.FindByNameAsync("email@email.com");