Why asp.net Identity user id is string?
Asked Answered
T

2

29

I want to use System.Guid type as an id for all of my tables in asp.net web api application. But I also use Asp.net Identity, which using a string-type id (to store guids as well). So I wonder why is it using string id instead of System.Guid by default? And what is better choice to use through all the application - Guid id or string-guid id? In case of using string - what is the most proper and reliable way to generate new id - in code or in database?

Tarsia answered 4/5, 2015 at 11:37 Comment(3)
The "why" is explained here - both answers in that post will really help. Hth.Postilion
Thanks @EdSF, but I still have an open question on what is the best way to organize application - string-guids or Guids (uniqueidentifier) for id?Tarsia
It depends on your requirements. See the answer of Rick Anderson (MSFT) for guidance.Postilion
D
14

With ASP.NET Core, you have a very simple way to specify the data type you want for Identity's models.

First step, override identity classes from < string> to < data type you want> :

public class ApplicationUser : IdentityUser<Guid>
{
}

public class ApplicationRole : IdentityRole<Guid>
{
}

Declare your database context, using your classes and the data type you want :

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
    }

And in your startup class, declare the identity service using your models and declare the data type you want for the primary keys :

services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext, Guid>()
            .AddDefaultTokenProviders();
Demeanor answered 17/10, 2016 at 6:29 Comment(1)
For information, there is a topic on that in the official documentation now : learn.microsoft.com/en-us/aspnet/core/security/authentication/…Demeanor
J
3

Depending on which version of ASP.Net authentication you're using, on the database ASP.NET Identity v2 should be storing it as a uniqueidentifier (Guid) in the AspNetUsers table. In more preceding versions it will store the user id as an int in the webpages_Membership table.

I believe it surfaces it as a string so it can be any data type you like under the hood and this can then be cast within your code as required.

Jowers answered 4/5, 2015 at 11:42 Comment(3)
Hi Tim, I am using the latest version of membership system for ASP.NET - ASP.NET Identity. I am still not sure, what is the best practice to use string for all the tables in my database or convert everything to GUID?Tarsia
@user3460585 int vs Guids are age-old argument. See these answers: dba.stackexchange.com/a/266/6868 blog.codinghorror.com/primary-keys-ids-versus-guids programmers.stackexchange.com/a/189031/86760Identification
Sorry, I didn't realise you were asking for your database. Generally what we do is store the username against a User record in our database which we can then reference the ASP.Net record, it also detaches you from the underlying membership tier.Jowers

© 2022 - 2024 — McMap. All rights reserved.