如何使用 Ninject 使用 Identity 2 中的默认身份模型将用户管理器注入到帐户控制器

2023-12-05

我在带有 Identity 2 的 MVC 5 项目中使用 Ninject。

对于其余的数据上下文和控制器,我对依赖注入没有任何问题。

对于使用 Identity 2 模型的帐户控制器,当我尝试登录时,我得到 null UserManager:

public class AccountController : Controller
{
    private ApplicationUserManager _userManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

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

注入所需依赖项的正确方法是什么?我没有创建自定义 UserManager,它是开箱即用的模型,ApplicationUserManager 在 App_Start 下的 IdentityConfig.cs 中定义。

附带说明:我正在使用 Ninject 的约定扩展:

private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind(
           x => x.FromThisAssembly()
               .SelectAllClasses()
               .BindAllInterfaces()
           );

Thanks.


我在使用 Ninject4.0、MVC5.2.3、Identity2.0 和 Owin3.0.1 时遇到了同样的问题,在这里你应该做的是让一切正常工作。

  1. 首先你应该得到Ninject.Web.Common.OwinHost来自 NuGet,因为如果您使用 Owin,则需要使用 NinjectMiddleware。

        public partial class StartUp
        { 
             private IKernel kernel = null;
             public void Configuration(IAppBuilder app)
             {
                kernel = CreateKernel();
                app.UseNinjectMiddleware(() => kernel);
                ConfigureAuth(app);
             }
    
             public IKernel CreateKernel()
             {
                var kernel = new StandardKernel();
                try
                {
    
                   // TODO: Put any other injection which are required.
                   RegisterServices(kernel);
                   return kernel;
                }
                catch
                {
                  kernel.Dispose();
                  throw;
                }
             }
          }
    
  2. 正如你所看到的,我们有一个方法可以注入我们想要的所有服务,在这种情况下我们必须注入应用程序用户管理器, 用户存储库 and 数据库上下文。因此对于注册服务 in Startup类,我们有:

         private static void RegisterServices(IKernel kernel) 
         {
    
            kernel.Bind<DbContext>().To<ApplicationDbContext>();
            kernel.Bind<IUserStore<User, long>>().To<UserStore<User, Role, long, UserLogin, UserRole, UserClaim>>();
    
            kernel.Bind<ApplicationUserManager>().ToSelf();
    
        }
    

    注意:我使用 long 而不是 string 作为 Identity 上所有键的类型,但是 使用默认值(字符串作为键)应该是相同的。

  3. In StartUp.Auth.cs文件包含部分StartUp我们应该改变的班级配置验证方法:

         internal static IDataProtectionProvider DataProtectionProvider
         { get; private set; }
    
         public void ConfigureAuth(IAppBuilder app)
         {
         DataProtectionProvider = app.GetDataProtectionProvider();
        //app.CreatePerOwinContext<ApplicationUserManager(ApplicationUserManager.Create)
    
         app.CreatePerOwinContext<ApplicationUserManager>(
         (option, context) => {
                var kernl = context.Get<IKernel>();
    
              return kernel.Get<ApplicationUserManager>();
    
            });
    
             //rest of the code 
       }
    

    注:我们得到应用程序用户管理器 from owin before but now我们从Ninject内核.请注意,我们创建了一个内部静态属性数据保护提供者并从 appBuilder 设置它,我们将在身份配置/应用程序用户管理器.(稍后见)

  4. 现在我们必须改变应用程序用户管理器,我们从中删除代码Create方法构造函数只有一个依赖项用户存储库,这是最终的外观:

           public class ApplicationUserManager : UserManager<User,long>
           {
            public ApplicationUserManager(IUserStore<User,long> store)
               :base(store)
              {
    
    
              this.UserValidator = new UserValidator<User, long>(this)
                {
                   AllowOnlyAlphanumericUserNames = false,
                   RequireUniqueEmail = true
                 };
             // Configure validation logic for passwords
             this.PasswordValidator = new PasswordValidator
                 {
                    RequiredLength = 6,
                    RequireNonLetterOrDigit = true,
                    RequireDigit = true,
                    RequireLowercase = true,
                    RequireUppercase = true,
                 };
    
              var dataProtectionProvider = Startup.DataProtectionProvider;
    
             // this is unchanged
             if (dataProtectionProvider != null)
             {
                IDataProtector dataProtector = 
                      dataProtectionProvider.Create("ASP.NET Identity");
    
                this.UserTokenProvider = 
                  new DataProtectorTokenProvider<User,long>(dataProtector);
             }
          }
       }
    
  5. 最后我们可以使用应用程序用户管理器 in our 账户控制器的 构造函数像这样:

     public class AccountController : ApiController
     {
         private ApplicationUserManager UserManager ;
         public AccountController(ApplicationUserManager userManager){
    
                UserManager = userManager;
         }
        // all apis come here
    
      }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Ninject 使用 Identity 2 中的默认身份模型将用户管理器注入到帐户控制器 的相关文章

  • 偶尔连接的 CQRS 系统 - 客户端和服务器命令 - 基于任务的屏幕

    Premise 建议在CQRS DDD ES样式应用程序使用task基于屏幕 这些屏幕引导用户并捕获意图 These task屏幕也可以称为感应式用户界面 UI 设计指南的一些示例可以帮助您创建现代的 用户友好的应用程序 Microsoft
  • Hibernate Envers:如何捕获谁删除了审计表中的实体

    我在用hibernate envers with spring 一切工作正常 除了当我删除一个实体时 它不会改变的值updated by and updated date在审计表内 它会在之后保存一个与之前完全相同的实体 仅复制 sprin
  • 如何打印Oracle中过程的定义?

    oracle中有没有办法查看过程的结构是什么 我正在尝试记录并运行程序 并希望将实际的程序结构存储在我的日志中 您可以查询ALL SOURCE table SELECT text FROM all source WHERE owner lt
  • 内容是从 WiFi 直接传输到 Chromecast,还是从 WiFi 传输到 Android 再传输到 Chromecast?

    内容是从 WiFi 直接传输到 Chromecast 还是从 WiFi 传输到 Android 或任何其他设备 再传输到 Chromecast 我知道其他设备可用于控制 Chromecast 但我只想知道由于电池寿命的原因 您是否可以直接从
  • 在magento Attributes中添加自定义属性并显示在前端

    我已经开始使用 magento 作为我的电子商务 cms 我知道这是一个非常强大的平台 最近 我发现它的功能可以帮助开发人员扩展核心 并且我已经成功添加了自定义类别选项 是否有机会在某个属性上达到相同的结果 我想在属性选项卡上添加文本描述并
  • html5 canvas 使用图像作为蒙版

    是否可以使用具有形状的图像作为整个画布或画布内图像的蒙版 我想将图像放置在画布中 并在图像上添加蒙版 然后将其另存为新图像 您可以使用 source in globalCompositeOperation 将黑白图像用作蒙版 首先 将蒙版图
  • 解析用户周围的位置

    您好 我开发了一个应用程序 我想问一个问题 在我的数据云解析中 我有 餐馆 类 我有三列 名称 类型字符串 imageFile 类型文件 description 类型数组和 Location 类型GeoPoint 我想知道使用哪种方法来获取
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720
  • Eclipse:如何增加查找/替换历史记录?

    查找 替换对话框显示最后 8 个条目 该对话框通过 Ctrl F 显示 我想增加 查找 和 替换为 输入字段的历史记录中显示的条目数 我必须搜索并替换几个字符串和正则表达式 因此我一次又一次地输入字符串和正则表达式 我并不是指文件内容更改的
  • MVC ASP.NET 或 Razor

    我对 MVC 很陌生 我对 Silver light WPF 和 MVVM 有相当多的了解 但对 MVC 知之甚少 我正在按照 Microsoft 网站上的主要教程进行操作http www asp net mvc tutorials get
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • 在 Oracle 中使用触发器记录对表的更改

    我的一门课有一个项目 当我们的两个表发生更改时 我们需要创建一个日志 插入 更新 删除 我们需要使用Oracle触发器和PL SQL 在日志文件中 我们需要记录用户ID 日期时间 IP地址和事件 插入 更新 删除 我知道如何设置触发器 但我
  • 是否有与 pdl2(或 Devel::REPL)中的 perl 调试器“x”等效的东西?

    我在用pdl2 the PDL http p3rl org PDLshell 也作为我的默认 Perl 交互式 shell 它加载所有不错的插件Devel REPL http search cpan org perldoc Devel 3a
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个
  • 在 MVC4 中使函数异步时 HttpContext.Current null

    我目前正在 VS2010 SP1 中开发 MVC4 我做了其中一个功能 控制器类异步 作为其中的一部分 我制作了控制器类 派生自 AsyncController 并添加了以下两个方法 参见代码部分 1 和 2 下 一种以 Async 结尾的
  • simple_fields_for 没有出现 [rails 4]

    我正在尝试创建两个隐藏字段 其中一个显示没有问题 但来自嵌套表单的另一个则没有 产品 rb class Product lt ActiveRecord Base has many product options dependent dest
  • jsf文件下载不起作用

    当我点击h commandButton它执行myBean dowanlod 方法 但它不下载任何文件 这是我在支持 bean 中的方法 没有例外 光标变得忙碌 似乎在等待响应 对于这种操作是否有任何额外的配置或者这段代码有什么问题吗
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • IOError:在 Linux 上的 ReportLab 中使用 matplotlib PNG 时“解码器 zip 不可用”,适用于 Windows

    我正在使用 ReportLab 打印 matplotlib 生成的图表 我可以在我的 Windows 开发机器上毫无问题地执行此操作 然而 当我部署到 Ubuntu 服务器时 渲染失败并出现所述错误 我假设我缺少一个 Python 模块 但
  • 使用 TkInter 绑定设置不可交互(点击)覆盖

    我已经浏览了其他几篇关于类似问题的帖子 所有这些似乎都指向this https stackoverflow com questions 29458775 tkinter see through window not affected by

随机推荐