首页 文章

Ninject OWIN扩展破坏了Web API的CreatePerOwinContext

提问于
浏览
2

为了尝试将Ninject与使用ASP.NET身份的新Web API 2项目一起使用,我遇到了一些奇怪的行为 . 我无法获取传递给CreatePerOwinContext()的回调以触发对Web API控制器的请求 . 对于MVC控制器,它们工作正常 .

重新创建的步骤:

  • 文件 - >新的VS 2013 ASP.NET Web应用程序

  • 检查MVC和WebAPI

  • 在身份验证下选择个人

  • 为Ninject,Ninject.Web.Common.OwinHost,Ninject.Web.WebApi.OwinHost和依赖包添加nuget包

  • 按照guidance为您的Owin启用的应用配置ninject

  • 在ApplicationUserManager.Create()中放置一个断点,然后在F5调试中放置一个断点

  • 见证您的Home控制器的请求正常工作 - 断点被击中 . 向API控制器做一个小提琴请求 - 例如,api / Account / Register,并且根本不会调用回调

我不是一个ninject爱好者,所以我不确定这是我做错了还是Ninject OWIN扩展中的错误 . 我倾向于将OwinContext留在后面并简单地使用Ninject perHttpRequest作用域,但我不确定ASP.NET Identity系统是否会破坏 . 我听说可能有内部调用OwinContext.Get()如果我没有在OWIN上下文中保留东西会破坏 .

非常感谢任何人的想法 .

1 回答

  • 3

    我最终通过使用Ninject进行所有生命周期管理来解决这个问题 . 显然.CreatePerOwinContext()是stop gap solution,如果使用完整的DI工具则不需要 .

    我唯一注意到的是,对于基于cookie的身份验证,ASP.NET身份将在OwinContext中查找其UserManager . 我正在使用基于令牌的身份验证,但我已经看到一些人继续将UserManager填入OwinContext .

    我的Ninject绑定:

    private static readonly Lazy<IKernel> _lazyKernel = new Lazy<IKernel>(CreateKernel);
    
        // Access the singleton kernel via this property
        public static IKernel Kernel { get { return _lazyKernel.Value; } }
    
    private void ConfigureNinject(IAppBuilder app)
    {
        app.UseNinjectMiddleware(() => Kernel);
        Kernel.Bind<IAppBuilder>().ToConstant(app);
    }
    
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<AuthDbContext>().ToSelf().InRequestScope().WithConstructorArgument("connectionString", "MyConnectionString");
        kernel.Bind<IUserStore<MyApplicationUser, int>>().To<MyUserStore>().InRequestScope();
        kernel.Bind<IRoleStore<MyRole, int>>().To<MyRoleStore>().InRequestScope();
        kernel.Bind<MyUserManager>().ToSelf().InRequestScope();
        kernel.Bind<ISecureDataFormat<AuthenticationTicket>>().To<SecureDataFormat<AuthenticationTicket>>();
        kernel.Bind<IDataSerializer<AuthenticationTicket>>().To<TicketSerializer>();
        kernel.Bind<IDataProtector>().ToMethod(x => x.Kernel.Get<IAppBuilder>().GetDataProtectionProvider().Create("ASP.NET Identity"));
        kernel.Bind<ITextEncoder>().To<Base64UrlTextEncoder>();
    }
    

相关问题