在尝试将 Ninject 与使用 ASP.NET Identity 的新 Web API 2 项目一起使用时,我遇到了一些奇怪的行为。我无法将回调传递给 CreatePerOwinContext() 以触发对 Web API Controller 的请求。对于 MVC Controller ,它们工作得很好。
重新创建的步骤:
- 文件 -> 新建 VS 2013 ASP.NET Web 应用程序
- 检查 MVC 和 WebAPI
- 在“身份验证”下选择“个人”
- 为 Ninject、Ninject.Web.Common.OwinHost、Ninject.Web.WebApi.OwinHost 和依赖包添加 nuget 包
- 关注guidance为您启用 Owin 的应用程序配置 ninject
- 在 ApplicationUserManager.Create() 中放置一个断点,然后按 F5 调试
- 见证对您的家庭 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/