The ASP.NET Identity system is designed to replace the previous ASP.NET Membership and Simple Membership systems. It includes profile support, OAuth integration, works with OWIN, and is included with the ASP.NET templates shipped with Visual Studio 2013.
In and of itself, it is a very nice and pleasant library that really does integrate nicely into a WebAPI or MVC project. The template project that comes with VS2013 spins up very quickly and provides the illusion of something that the developer can just forget about. Were that the case, I would not have this post.
All I wanted was to change the default primary key from a
GUID to an
int. My initial thought was to change the default
ApplicationUser from inheriting from the non-generic
IdentityUser to the generic
IdentityUser<int, VigilUserLogin, VigilUserRole, VigilUserClaim>. Compiling worked just fine, running caused all kinds of type casting problems. Why? Because all of the other classes surrounding the
IdentityUser were all coded to the
string type (which internally is a
Thus began the big hunt to find out all of the places where I needed to override, inherit, or otherwise manipulate the library to get the primary key to be an integer. This meant replacing the five main classes that create the authentication and authorization schema:
Then I had to create a new
UserManager to utilize these new classes, and create a new
ClaimsPrincipal to store and retrieve the new security identifier (Sid) for the user. Finally, a new
BaseController class was created that all other controllers must inherit from, in order to utilize all of this new code.
At this point, I am wrestling with the fact that now my domain model has a hard requirement on the Microsoft.AspNet.Identity library. I had initially hoped to have my User and Role domain models be completely separated from the actual authentication/authorization system. This creates a hard link that is going to be the death of me unless I can find a way to isolate the framework and run unit tests without requiring the database. For now, though, I am going to continue in this direction, and turn a blind eye to the technical debt accruing from this decision. Maybe before I ship this, I will find a better way to do it all, but for now at least I have my integers.