asp.net-web-api - Ninject OWIN 扩展破坏了 Web API 的 CreatePerOwinContext

标签 asp.net-web-api ninject owin asp.net-identity-2

在尝试将 Ninject 与使用 ASP.NET Identity 的新 Web API 2 项目一起使用时,我遇到了一些奇怪的行为。我无法将回调传递给 CreatePerOwinContext() 以触发对 Web API Controller 的请求。对于 MVC Controller ,它们工作得很好。

重新创建的步骤:

  1. 文件 -> 新建 VS 2013 ASP.NET Web 应用程序
  2. 检查 MVC 和 WebAPI
  3. 在“身份验证”下选择“个人”
  4. 为 Ninject、Ninject.Web.Common.OwinHost、Ninject.Web.WebApi.OwinHost 和依赖包添加 nuget 包
  5. 关注guidance为您启用 Owin 的应用程序配置 ninject
  6. 在 ApplicationUserManager.Create() 中放置一个断点,然后按 F5 调试
  7. 见证对您的家庭 Controller 的请求工作正常 - 命中断点。向 API Controller 发出 fiddler 请求 - 例如 api/Account/Register,并且回调根本不会被调用

我不是一个 ninject 爱好者,所以我不确定这是我做错了还是 Ninject OWIN 扩展中的错误。我倾向于放弃 OwinContext 并简单地使用 Ninject perHttpRequest 范围,但我不确定 ASP.NET Identity 系统是否会崩溃。我听说如果我没有将内容保留在 OWIN 上下文中,可能会对 OwinContext.Get() 进行内部调用,这会中断。

非常感谢任何人的想法。

最佳答案

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

我所看到的唯一需要注意的是,对于基于 cookie 的身份验证,ASP.NET Identity 将在 OwinContext 中查找其 UserManager。我正在使用基于 token 的身份验证,但我看到有些人继续将 UserManager 填充到 OwinContext 中。

我的 Ninject 绑定(bind):

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

关于asp.net-web-api - Ninject OWIN 扩展破坏了 Web API 的 CreatePerOwinContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26306364/

相关文章:

c# - 由于循环作用域回调引用导致 ninject 内存泄漏

asp.net - 如何在 asp.net Web 窗体上实现 Ninject 或 DI?

c# - ASP.NET MVC 5 应用程序的 Microsoft 身份验证循环

c# - WebApi HttpPost 无法在 Windows Azure 上运行

asp.net-web-api - 在 dotnet core web API 中接收多部分表单数据

c# - 拦截 OData "query"

asp.net-web-api - 如何在 IdentityServer4 中运行时添加/管理用户声明

webforms - 使用现有的自定义库从 HttpHandler 访问 Ninject Kernel.Get()

asp.net - 触发 OWIN cookie 中间件设置为被动身份验证模式的正确方法是什么?

c# - 将 Active Directory 与用于 SPA 的 Web API 结合使用