1
\$\begingroup\$

I need code review for using ASP.NET Identity in a new app.

Goals:

  • Use int instead of GUID for IDs.
  • Separate identity from view layer

I need code review if I did everything right. Yes it is working but maybe I did something that I shouldn't or maybe there is some place for improvement.

ApplicationUser

public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,
    CustomUserClaim>
    {
        public ICollection<ProductCategory> ProductCategories { get; set; }
        public ICollection<Store> Stores { get; set; }
        public ICollection<Product> Products { get; set; }

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
    UserManager<ApplicationUser, int> manager)
        {
            var userIdentity = await manager.CreateIdentityAsync(
                this, DefaultAuthenticationTypes.ApplicationCookie);            
            return userIdentity;
        }
    }

    public class CustomUserRole : IdentityUserRole<int> { }
    public class CustomUserClaim : IdentityUserClaim<int> { }
    public class CustomUserLogin : IdentityUserLogin<int> { }

    public class CustomRole : IdentityRole<int, CustomUserRole>
    {
        public CustomRole() { }
        public CustomRole(string name) { Name = name; }
    }

    public class CustomUserStore : UserStore<ApplicationUser, CustomRole, int,
        CustomUserLogin, CustomUserRole, CustomUserClaim>
    {
        public CustomUserStore(ApplicationDbContext context)
            : base(context)
        {
        }
    }

    public class CustomRoleStore : RoleStore<CustomRole, int, CustomUserRole>
    {
        public CustomRoleStore(ApplicationDbContext context)
            : base(context)
        {
        }
    }

DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole,
    int, CustomUserLogin, CustomUserRole, CustomUserClaim>
    {
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }

        public ApplicationDbContext()
            : base("DefaultConnection")
        {...

View models are still in view layer. All above is in data layer (class library). In the view assembly in AccountController I changed all ApplicationUser to reference ApplicationUser in data layer assembly.

I also added extension to get UserID as int:

public static int GetUserIdInt(this IIdentity identity)
        {
            if (identity == null)
                throw new ArgumentNullException("identity");

            string stringUserId = identity.GetUserId();

            int userId;
            if (string.IsNullOrWhiteSpace(stringUserId) || !int.TryParse(stringUserId, out userId))
            {
                return default(int);
            }

            return userId;
        }
\$\endgroup\$
  • \$\begingroup\$ I'm curious about the IdentityUser class, it would be nice if you could include it for context ;) \$\endgroup\$ – Mathieu Guindon Mar 24 '15 at 19:28
  • 2
    \$\begingroup\$ IdentityUser is class from Microsoft.AspNet.Identity.EntityFramework. \$\endgroup\$ – 1110 Mar 24 '15 at 19:29
  • \$\begingroup\$ Haha can you tell I don't do much web dev! thanks for the clarification :) \$\endgroup\$ – Mathieu Guindon Mar 24 '15 at 19:32
  • \$\begingroup\$ I don't understand? Did I offend you? \$\endgroup\$ – 1110 Mar 24 '15 at 19:33
  • \$\begingroup\$ Not at all! Sorry for the confusion \$\endgroup\$ – Mathieu Guindon Mar 24 '15 at 19:34
1
\$\begingroup\$

Your customization looks fine - that's the way it is recommended to do it.

The only note I could add is about your GetUserIdInt method which you can get rid of. You can just use this generic overload:

User.Identity.GetUserId<int>()
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.