ASP.NET Identity Provider for NHibernate
Clone or download
lnu NuGet.targets removed(obsolete)
NuGet.targets removed(obsolete)
Latest commit 28b5907 Oct 23, 2017

README.md

Build status Stories in Ready

NHibernate.AspNet.Identity

ASP.NET Identity provider that uses NHibernate for storage

Throughput Graph

About this

About this

Purpose

ASP.NET MVC 5 shipped with a new Identity system (in the Microsoft.AspNet.Identity.Core package) in order to support both local login and remote logins via OpenID/OAuth, but only ships with an Entity Framework provider (Microsoft.AspNet.Identity.EntityFramework).

Features

  • Drop-in replacement ASP.NET Identity with NHibernate as the backing store.
  • Based on same schema required by EntityFramework for compatibility model
  • Contains the same IdentityUser class used by the EntityFramework provider in the MVC 5 project template.
  • Supports additional profile properties on your application's user model.
  • Provides UserStore implementation that implements the same interfaces as the EntityFramework version:
    • IUserStore
    • IUserLoginStore
    • IUserRoleStore
    • IUserClaimStore
    • IUserPasswordStore
    • IUserSecurityStampStore

Quick-start guide

These instructions assume you know how to set up NHibernate within an MVC application.

  1. Create a new ASP.NET MVC 5 project, choosing the Individual User Accounts authentication type.
  2. Remove the Entity Framework packages and replace with NHibernate Identity:
Uninstall-Package Microsoft.AspNet.Identity.EntityFramework
Uninstall-Package EntityFramework
Install-Package NHibernate.AspNet.Identity
  1. In ~/Models/IdentityModels.cs:

    • Remove the namespace: Microsoft.AspNet.Identity.EntityFramework
    • Add the namespace: NHibernate.AspNet.Identity
    • Remove the ApplicationDbContext class completely.
  2. In ~/Controllers/AccountController.cs

    • Remove the namespace: Microsoft.AspNet.Identity.EntityFramework
    • Add the relevant ISession implementation that will be used by default. This could be from a DI implementation. Note: This isn't mandatory, if you are using a framework that will inject the dependency, you shouldn't need the parameterless constructor.
  3. Setup configuration code

NHibernate

	// this assumes you are using the default Identity model of "ApplicationUser"
	var myEntities = new [] {
		typeof(ApplicationUser)
	};
	
    var configuration = new Configuration();
    configuration.Configure("sqlite-nhibernate-config.xml");
    configuration.AddDeserializedMapping(MappingHelper.GetIdentityMappings(myEntities), null);

    var factory = configuration.BuildSessionFactory();
    var session = factory.OpenSession();

    var userManager = new UserManager<ApplicationUser>(
        new UserStore<ApplicationUser>(session);

FluentNHibernate

	// this assumes you are using the default Identity model of "ApplicationUser"
	var myEntities = new [] {
		typeof(ApplicationUser)
	};
	
	var configuration = Fluently.Configure()
	   .Database(/*.....*/)
	   .ExposeConfiguration(cfg => {
	       cfg.AddDeserializedMapping(MappingHelper.GetIdentityMappings(myEntities), null);
		});
	
    var factory = configuration.BuildSessionFactory();
    var session = factory.OpenSession();

    var userManager = new UserManager<ApplicationUser>(
        new UserStore<ApplicationUser>(session);

Thanks To

Special thanks to David Boike whos RavenDB AspNet Identity project gave me the base for jumpstarting the NHibernate provider