I am a newbie in ASP.NET, and currently learning ASP.NET Identity. I know it's built on top of OWIN implementation by Microsoft, and I am also still learning that too. So, I came across the extension method CreatePerOwinContext in the Owin startup code, and I don't see a clear purpose of using it. Is it some kind of dependency injection container? What is the real purpose of the method? In what case it should be applied?
CreatePerOwinContext registers a static callback which your application will use to get back a new instance of a specified type.
This callback will be called once per request and will store the object/objects in OwinContext so that you will be able to use them throughout the application.
Let's say you have defined your own implementation of IdentityDbContext:
public class ApplicationDatabaseContext : IdentityDbContext<MyApplicationUser, MyRole, Guid, MyUserLogin, MyUserRole, MyUserClaim> { public ApplicationDatabaseContext() : base("<connection string>") { } public static ApplicationDatabaseContext Create() { return new ApplicationDatabaseContext(); } protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Customize your table creation here. #region USERS - INFOS modelBuilder.Entity<UserInfo>() .Property(p => p.FirstName) .HasColumnType("varchar") .HasMaxLength(70); modelBuilder.Entity<UserInfo>() .Property(p => p.LastName) .HasColumnType("varchar") .HasMaxLength(70); modelBuilder.Entity<UserInfo>() .Property(p => p.Address) .HasColumnType("varchar") .HasMaxLength(100); modelBuilder.Entity<UserInfo>() .Property(p => p.City) .HasColumnType("varchar") .HasMaxLength(100); modelBuilder.Entity<UserInfo>() .ToTable("UsersInfo"); #endregion } public DbSet<UserInfo> UsersInfo { get; set; } }
and your implementation of UserManager:
public class ApplicationUserManager : UserManager<MyApplicationUser, Guid> { public ApplicationUserManager(IUserStore<MyApplicationUser, Guid> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { var manager = new ApplicationUserManager(new MyUserStore(context.Get<ApplicationDatabaseContext>())); manager.UserValidator = new UserValidator<MyApplicationUser, Guid>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; manager.PasswordValidator = new PasswordValidator() { RequiredLength = 6, RequireNonLetterOrDigit = false, // RequireDigit = true, RequireLowercase = false, RequireUppercase = false, }; var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider<MyApplicationUser, Guid>(dataProtectionProvider.Create("PasswordReset")); } return (manager); } }
In your Owin Startup you will register the callback:
// IAppBuilder app app.CreatePerOwinContext<ApplicationDatabaseContext>(ApplicationDatabaseContext.Create); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
which will call the static method:
public static ApplicationDatabaseContext Create() { return new ApplicationDatabaseContext(); }
and
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) { ... }
Now you will be able to access your database context and user manager in a simple straightforward way:
ApplicationDatabaseContext dbContext = context.OwinContext.Get<ApplicationDatabaseContext>(); ApplicationUserManager userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();
In your ApiController (if you're using WebApi):
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication; ApplicationUserManager applicationUserManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With