- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在使用 OWIN 请求管道创建 ApplicationUserManager 时,我在使用依赖注入(inject)创建自定义 UserStore 时遇到问题。
背景
我正在尝试将 Web 应用程序中的用户功能从使用 SimpleMembership 迁移到新的 ASP.NET Identity。当开始一个新的 MVC 5 项目时,单页应用程序的默认实现使用 ASP.Identity,使用 Entity Framework 来实现 UserStore 功能。
在我的例子中,我们已经使用 NHibernate 作为 ORM,并使用 ninject 来实现工作单元模式,这样我们每个请求都有一个 NHibernate session ,我想让 ASP.Identity 与我们现有的框架一起工作.
为此,我创建了一个自定义 UserStore,它可以通过注入(inject)相关的存储库/nhibernate session 等来创建。然后可以使用 Ninject 将其注入(inject)到 Controller 的构造函数中,而不是使用默认实现的 GetOwinContext 功能。
为了做到这一点,我在默认情况下创建 UserManager 类的 Startup 的 ConfigureAuth(IAppBuilder app) 方法中注释掉了以下行:
// app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
相反,我使用在安装 Ninject.Web.Common.Webhost nuget 包时创建的 NinjectWebCommon 来创建相关绑定(bind)。
此实现在某些 UserManager 操作上运行良好,但对于某些操作(例如 ResetPasswordAsync),它会失败,因为未调用默认的 ApplicationUserManager 实现,因此 UserManager 类中的 UserTokenProvider 从未设置:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
// You can write your own provider and plug in here.
manager.RegisterTwoFactorProvider("PhoneCode", new PhoneNumberTokenProvider<ApplicationUser>
{
MessageFormat = "Your security code is: {0}"
});
manager.RegisterTwoFactorProvider("EmailCode", new EmailTokenProvider<ApplicationUser>
{
Subject = "Security Code",
BodyFormat = "Your security code is: {0}"
});
manager.EmailService = new EmailService();
manager.SmsService = new SmsService();
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
因此,未设置 UserTokenProvider。
问题
我想使用 OWIN 管道,因为 Visual Studio 的 ApplicationUserManager 类的默认实现在其 Create 回调方法中注入(inject)了 IDataProtectionProvider。但是,我还想使用依赖注入(inject)创建我的 UserStore,但我不知道如何使用依赖注入(inject)在此方法中创建 UserStore。
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
// WANT TO CREATE THE USER STORE USING NINJECT DEPENDENCY INJECTION HERE
// var userStore = ...
var manager = new ApplicationUserManager(userStore);
}
我试图通过使用 Ninject.Web.Common.OwinHost nuget 包并在 Startup 类中创建内核来绕过这个限制。
public void ConfigureAuth(IAppBuilder app)
{
// Setup
app.UseNinjectMiddleware(CreateKernel);
}
但是,Ninject.Web.Common.OwinHost 不公开其内核,因此我无法使用服务定位模式在创建回调中将值注入(inject)我的自定义 UserStore。
我还尝试创建一个单例内核,并使用 app.CreatePerOwinContext(CreateKernel) 向相关委托(delegate)注册它,这样我以后可以访问内核,但是当我调用 context.Get() 时,它只返回 null。
问题
如何使用 CreatePerOwinContext 注册回调函数以创建使用自定义 UserStore 的自定义 UserManager,然后使用 Ninject 在 Create 回调中使用依赖注入(inject)创建自定义 UserStore,这样我也可以访问 IdentityFactoryOptions Owin 用于注入(inject)用户 token 提供程序?
最佳答案
信息:
可以将内核注册为单例,以便 ninject 中间件可以使用同一个内核,并且还可以在 owin 上下文中注册。
public static StandardKernel CreateKernel()
{
if (_kernel == null)
{
_kernel = new StandardKernel();
_kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
_kernel.Load(Assembly.GetExecutingAssembly(), Assembly.Load("Super.CompositionRoot"));
}
return _kernel;
}
回调函数 app.CreatePerOwinContext(ApplicationUserManager.Create) 将调用 ApplicationUserManager.Create 而不是将其注册为稍后在设置期间调用。因此,需要在 ApplicationUserManager 的 Create 回调之前注册 CreateKernel 函数,否则如果您尝试从该方法中的 owin 上下文中获取内核,则会出现空引用异常。
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(CreateKernel);
app.UseNinjectMiddleware(CreateKernel);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
}
这将允许您访问内核以在 ApplicationUserManager 的创建回调中创建自定义 UserStore:
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var kernel = context.Get<StandardKernel>();
var userStore = kernel.Get<IUserStore<User, int>>();
var manager = new ApplicationUserManager(userStore);
//...
}
我知道在一般情况下依赖注入(inject)应该比服务定位更受青睐,但在这种情况下我看不出解决它的方法 - 除非有人有任何更好的建议?
这将允许您使用 Ninject 来实现利用 Ninject 的 InRequestScope().OnDeactivation 功能的工作单元模式。我知道 UserManager 类有一个 per request lifetime ,但不知道在请求完成时提交任何未完成事务的最合适方法。
关于c# - 使用 Ninject OWIN 中间件在 OWIN 启动中依赖注入(inject) UserStore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24373311/
我正在构建一个 MVC 5 应用程序。我需要根据 AD 和 sql 数据库或 Web 服务对人员进行身份验证。 要求是如果一个人登录到公司网络或通过 VPN 连接,我必须在不要求凭据的情况下登录它们。
有没有办法从 WindowsAzureActiveDirectoryBearerAuthenticationOptions 等扩展中调试 OWIN 中间件,并确切了解请求被拒绝的原因(例如,没有 to
我们对 Nancy/Owin 托管的 api 有一种奇怪的体验 - 当 URL 查询字符串超过 255 个字符时,Nancy 返回 400 Bad Request。 知道如何解决这个问题吗? 最佳答案
正确的处理方式是什么Content-Length在 Owin 中间件中编写正文内容时? 目前我们正在使用 context.Response.Write(data); // data is a stri
我目前正在构建一个包含多个 OWIN 中间件的库。这些中间件应该按照一定的顺序执行。在 OWIN 的第一个版本中,有 IAppBuilder界面。然而IAppBuilder不再是 OWIN 的一部分,
我们的 Mvc/WebAPI 解决方案目前有四个我们已在 ADFS3 中注册的可信身份提供者。我们的用户可以通过直接链接使用这些身份提供者中的每一个,有效地解决 ADFS 可能创建的任何家庭领域 co
实际上我知道有关于 KATANA 好处的主题和问题,我知道它们,但我的问题是 Katana 在业务方面可以为我做什么?比如为什么我应该使用 WEB API 作为一个单独的模块(中间件)?它可以与哪个中
IOwinContext 中似乎没有 HTTP Referrer,我需要捕获它。获取该特定变量的正确方法是什么? IOwinContext 有几个 Typed PEM,但我没有特别看到 referer
我正在开发一个使用 Katana 公开自托管 WebAPI 服务的应用程序。我想以类似于 IIS 允许单个网站下的多个应用程序的方式来管理内容。 例如,我可能有三个包含 web api 内容的文件夹:
从 asp.net 6 开始,将没有名为 global.asax 的文件,但 global.asax 有许多事件,例如 · Application_Init · 申请_开始 · Session_Sta
我从 http://blogs.msdn.com/b/webdev/archive/2013/11/22/debugging-owin-app-or-framework.aspx 得到了演示代码,它显
我正在使用 Facebook Owin 身份验证并或多或少地遵循 Microsoft 示例。我或多或少地关注第一次用户登录,一切正常。但如果他们退出并重试,似乎之前的 .AspNet.Correlat
我已经阅读了很多关于此的帖子,但仍然无法使其正常工作。我正在使用 Visual Studio 2013。我创建了一个新的 MVC 5 项目,并认为使用新的 facebook 登录集成会很酷。它在我的
在使用 OWIN 请求管道创建 ApplicationUserManager 时,我在使用依赖注入(inject)创建自定义 UserStore 时遇到问题。 背景 我正在尝试将 Web 应用程序中的
我试图了解 Microsoft.Owin.Security.ActiveDirectory 的用途,但似乎找不到任何文档、测试,甚至 much以文章的方式。 这个包的实际用途是什么?我试图使用它来创建
如果我使用 OwinMiddleware 和 IOwinContext 等 Microsoft.Owin 类型构建 OWIN 中间件,我的中间件是否可以与非 Microsoft Owin 主机/服务器
我在 IIS 7.5 中部署了一个 Owin 中间件身份验证项目作为 Web 应用程序但问题是 Startup.cs 没有被调用。 [assembly: OwinStartup(typeof(Auth
据我所知Microsoft.Owin.Host.SystemWeb允许我在 IIS 上运行 OWIN 应用程序,但今天我发现了另一个名为 Microsoft.Owin.Host.IIS 的包(据我从其
有谁知道将 Owin Asp.Net Identity Cookie 身份验证(本地数据库)与 Owin OpenId 身份验证(云)混合的一个很好的例子?然后用户可以选择通过创建新用户和密码(存
我将 MVC 5 与 OWIN 身份验证一起使用。 这是我的 StartUp.cs 的代码。 public void ConfigureAuth(IAppBuilder app) {
我是一名优秀的程序员,十分优秀!