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;
 }
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
asked Mar 24, 2015 at 19:12
\$\endgroup\$
5
  • \$\begingroup\$ I'm curious about the IdentityUser class, it would be nice if you could include it for context ;) \$\endgroup\$ Commented Mar 24, 2015 at 19:28
  • 2
    \$\begingroup\$ IdentityUser is class from Microsoft.AspNet.Identity.EntityFramework. \$\endgroup\$ Commented Mar 24, 2015 at 19:29
  • \$\begingroup\$ Haha can you tell I don't do much web dev! thanks for the clarification :) \$\endgroup\$ Commented Mar 24, 2015 at 19:32
  • \$\begingroup\$ I don't understand? Did I offend you? \$\endgroup\$ Commented Mar 24, 2015 at 19:33
  • \$\begingroup\$ Not at all! Sorry for the confusion \$\endgroup\$ Commented Mar 24, 2015 at 19:34

1 Answer 1

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>()
answered Apr 4, 2015 at 20:34
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.