It can be bit tricky to configure both Ninject and Asp.Net Identity UserManager if some value is expected from DI to configure UserManager. We will look into configuring both and also use OwinContext to get UserManager.
As usual, all configuration need to be done on Startup.cs. It is just a convention but can be used with different name, the important thing is to decorate class with following attribute to make it Owin start-up:
Ninject configuration
Configuring Ninject kernel through method which would be used to register under Owin.
Startup.cs
To register with Owin we need to have Ninject.Web.Common.OwinHost package which would provide an extension method for configuration with AppBuilder.
Startup.cs
The kernel variable is created to save the Ninject configuration which can be used to get value from it.
Ex:
Asp.Net Identity User Manager Configuration
There is actually two way do configure it. The first to register Ninject with CreatePerOwinContext and retrieve kernel through Owin context parameter.
and then
The above is standard approach but while performance profiling I find issue on CreateKernel which gets keep disposing and calling multiple times even if we try to do in this way.
So, the best option is to create kernel variable like we did under Ninject Configuration section and utilizing same to get setting out of Ninject kernel.
MyUserManager.cs
Then simply register the context on Startup.cs
Startup.cs
One general thing that I had not explained is to have proper initialization of DataProtectorTokenProvider. It is generally need to be initialized on Owin Startup, with IdentityFactoryOptions<MyUserManager> we are able to create data protection provider.
Consuming Asp.Net Identity User Manager
Now, we are all set to consume User Manager. Since, we have set it on Owin context, it can be used throughout of application by following approach:
Quick glance of entire Startup.cs
As usual, all configuration need to be done on Startup.cs. It is just a convention but can be used with different name, the important thing is to decorate class with following attribute to make it Owin start-up:
[assembly: OwinStartup(typeof(MyProject.Web.Startup))]
Ninject configuration
Configuring Ninject kernel through method which would be used to register under Owin.
Startup.cs
public IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
//kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
// TODO: Put any other injection which are required.
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
To register with Owin we need to have Ninject.Web.Common.OwinHost package which would provide an extension method for configuration with AppBuilder.
Startup.cs
private IKernel kernel = null;
public void Configuration(IAppBuilder app)
{
kernel = CreateKernel();
app.UseNinjectMiddleware(() => kernel);
}
The kernel variable is created to save the Ninject configuration which can be used to get value from it.
Ex:
var service = kernel.Get<IServiceLocater>();
setting = service.SystemService.GetSystemSetting();
Asp.Net Identity User Manager Configuration
There is actually two way do configure it. The first to register Ninject with CreatePerOwinContext and retrieve kernel through Owin context parameter.
app.CreatePerOwinContext(CreateKernel);
and then
app.CreatePerOwinContext<MyUserManager>((option, context) =>
{
var kernl = context.Get<IKernel>();
var setting = service.SystemService.GetSystemSetting();
var userStore = kernel.Get<IUserStore<MyUserDomain>>();
return new MyUserManager(userStore);
});
The above is standard approach but while performance profiling I find issue on CreateKernel which gets keep disposing and calling multiple times even if we try to do in this way.
app.CreatePerOwinContext(() => kernel); // using above variable but kept getting disposed.
So, the best option is to create kernel variable like we did under Ninject Configuration section and utilizing same to get setting out of Ninject kernel.
MyUserManager.cs
public static MyUserManager Create(IdentityFactoryOptions<MyUserManager> options,
IUserStore<MyUserDomain> userStore, UserPolicy userPolicy)
{
var manager = new MyUserManager(userStore);
// Settings that we want to have based on implementation of Manager class
manager.UserPolicy = userPolicy; // Custom defined
manager.PasswordValidator = new CustomPasswordValidator(userPolicy);
manager.UserLockoutEnabledByDefault = false;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(userPolicy.DefaultAccountLockoutTimeSpan);
manager.MaxFailedAccessAttemptsBeforeLockout = userPolicy.FailedAttemptLockCount;
manager.UserTokenProvider = new DataProtectorTokenProvider<MyUserDomain, string>(
options.DataProtectionProvider.Create("Asp.Net Identity"))
{
TokenLifespan = TimeSpan.FromDays(userPolicy.TokenExpiryInDays)
};
return manager;
}
Then simply register the context on Startup.cs
Startup.cs
app.CreatePerOwinContext<MyUserManager>((options, context) =>
{
var userStore = kernel.Get<IUserStore<MyUserDomain>>();
return MyUserManager.Create(options, userStore, setting.UserPolicy);
});
One general thing that I had not explained is to have proper initialization of DataProtectorTokenProvider. It is generally need to be initialized on Owin Startup, with IdentityFactoryOptions<MyUserManager> we are able to create data protection provider.
Consuming Asp.Net Identity User Manager
Now, we are all set to consume User Manager. Since, we have set it on Owin context, it can be used throughout of application by following approach:
HttpContext.GetOwinContext().GetUserManager<MyUserManager>()
Quick glance of entire Startup.cs
public sealed class Startup
{
/// <summary>
/// Application level settings.
/// </summary>
private Setting setting;
/// <summary>
/// Ninject kernel for injection.
/// </summary>
private IKernel kernel = null;
/// <summary>
/// Configurations of the application.
/// </summary>
/// <param name="app">The application.</param>
public void Configuration(IAppBuilder app)
{
kernel = CreateKernel();
app.UseNinjectMiddleware(() => kernel);
// Populate setting from services.
var service = kernel.Get<IServiceLocater>();
setting = service.SystemService.GetSystemSetting();
app.CreatePerOwinContext<MyUserManager>(CreateUserManager);
ConfigureAuthentication(app);
}
/// <summary>
/// Creates the user manager.
/// </summary>
/// <param name="options">The options.</param>
/// <param name="context">The context.</param>
/// <returns>User manager instance.</returns>
private MyUserManager CreateUserManager(IdentityFactoryOptions<MyUserManager> options, IOwinContext context)
{
var userStore = kernel.Get<IUserStore<MyUserDomain>>();
return MyUserManager.Create(options, userStore, setting.UserPolicy);
}
/// <summary>
/// Configures the authentication.
/// </summary>
/// <param name="app">The application builder.</param>
private void ConfigureAuthentication(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
SlidingExpiration = true,
ExpireTimeSpan = TimeSpan.FromMinutes(setting.System.Session.SessionTimeoutInMinutes)
});
}
/// <summary>
/// Creates the kernel.
/// </summary>
/// <returns></returns>
public IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
//kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
//kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
// TODO: Put any other injection which are required.
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}
}
Comments
Post a Comment