Adding roles to users by registration

Posted 319 days ago by Vagelis
0

I am trying to add default role to user by registration  but a second empty users is created in database and a second empty role is created too.

In Register.cshtml.cs and in function OnPostAsync I am trying to create the "default" if it doesn't exist and assign user to it if it exists.

 

 

 var defaultrole = _roleManager.FindByNameAsync("default").Result;
 if (defaultrole != null)
 {
                        IdentityResult addToRoleresult = await _userManager.AddToRoleAsync(user, defaultrole.Name);
                    }
                    else
                    {
                        IdentityResult roleCreateResult = await _roleManager.CreateAsync(new EmployeesCalendarIdentityRole("default"));
                        if (roleCreateResult.Succeeded)
                        {
                            IdentityResult roleresult = await _userManager.AddToRoleAsync(user, "default");
                        }
                    } 

 

The code in EmployeesCalendarIdentityContext.cs is the following

using EmployeesCalendar.Areas.Identity.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System.Reflection.Emit;

namespace EmployeesCalendar.Data;

public class EmployeesCalendarIdentityContext : IdentityDbContext<
        EmployeesCalendarIdentityUser, EmployeesCalendarIdentityRole, string,
        EmployeesCalendarIdentityUserClaim, EmployeesCalendarIdentityUserRole, EmployeesCalendarIdentityUserLogin,
        EmployeesCalendarIdentityRoleClaim, EmployeesCalendarIdentityUserToken>
{
    public EmployeesCalendarIdentityContext(DbContextOptions<EmployeesCalendarIdentityContext> 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);

        builder.Entity<EmployeesCalendarIdentityUser>(b =>
        {
            // Each User can have many UserClaims
            b.HasMany(e => e.Claims)
                .WithOne(e => e.User)
                .HasForeignKey(uc => uc.UserId)
                .IsRequired();

            // Each User can have many UserLogins
            b.HasMany(e => e.Logins)
                .WithOne(e => e.User)
                .HasForeignKey(ul => ul.UserId)
                .IsRequired();

            // Each User can have many UserTokens
            b.HasMany(e => e.Tokens)
                .WithOne(e => e.User)
                .HasForeignKey(ut => ut.UserId)
                .IsRequired();

            // Each User can have many entries in the UserRole join table
            b.HasMany(e => e.UserRoles)
                .WithOne(e => e.User)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });

        builder.Entity<EmployeesCalendarIdentityRole>(b =>
        {
            // Each Role can have many entries in the UserRole join table
            b.HasMany(e => e.UserRoles)
                .WithOne(e => e.Role)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();

            // Each Role can have many associated RoleClaims
            b.HasMany(e => e.RoleClaims)
                .WithOne(e => e.Role)
                .HasForeignKey(rc => rc.RoleId)
                .IsRequired();
        });

        builder.Entity<EmployeesCalendarIdentityUserRole>().HasKey(p => new { p.UserId, p.RoleId });
    }
}

And the code for the overrided user, roles etc is like this

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;

namespace EmployeesCalendar.Areas.Identity.Data;

// Add profile data for application users by adding properties to the EmployeesCalendarIdentityUser class
public class EmployeesCalendarIdentityUser : IdentityUser
{
    [PersonalData]
    public string? Name { get; set; }
    [PersonalData]
    public DateTime DOB { get; set; }


    public virtual List<EmployeesCalendarIdentityUserClaim> Claims { get; set; }=new List<EmployeesCalendarIdentityUserClaim>();
    public virtual List<EmployeesCalendarIdentityUserLogin> Logins { get; set; }=new List<EmployeesCalendarIdentityUserLogin>();
    public virtual List<EmployeesCalendarIdentityUserToken> Tokens { get; set; }= new List<EmployeesCalendarIdentityUserToken>();
    public virtual List<EmployeesCalendarIdentityUserRole> UserRoles { get; set; }=new List<EmployeesCalendarIdentityUserRole>();
}


public class EmployeesCalendarIdentityRole : IdentityRole
{
    public EmployeesCalendarIdentityRole() 
    {
    }
    public EmployeesCalendarIdentityRole(string roleName) : base(roleName)
    {
    }

    public virtual List<EmployeesCalendarIdentityUserRole> UserRoles { get; set; }=new List<EmployeesCalendarIdentityUserRole>() ;
    public virtual List<EmployeesCalendarIdentityRoleClaim> RoleClaims { get; set; } = new List<EmployeesCalendarIdentityRoleClaim>();
}

public class EmployeesCalendarIdentityUserRole : IdentityUserRole<string>
{
    public virtual EmployeesCalendarIdentityUser User { get; set; } = new EmployeesCalendarIdentityUser();
    public virtual EmployeesCalendarIdentityRole Role { get; set; }=new EmployeesCalendarIdentityRole();
}

public class EmployeesCalendarIdentityUserClaim : IdentityUserClaim<string>
{
    public virtual EmployeesCalendarIdentityUser User { get; set; }=new EmployeesCalendarIdentityUser();
}

public class EmployeesCalendarIdentityUserLogin : IdentityUserLogin<string>
{
    public virtual EmployeesCalendarIdentityUser User { get; set; } = new EmployeesCalendarIdentityUser();
}

public class EmployeesCalendarIdentityRoleClaim : IdentityRoleClaim<string>
{
    public virtual EmployeesCalendarIdentityRole Role { get; set; } = new EmployeesCalendarIdentityRole();
}

public class EmployeesCalendarIdentityUserToken : IdentityUserToken<string>
{
    public virtual EmployeesCalendarIdentityUser User { get; set; } = new EmployeesCalendarIdentityUser();
}


 

 

Any idea why?

 

  • 0

    The problem was with 

    public virtual List<EmployeesCalendarIdentityUserRole> UserRoles { get; set; }=new List<EmployeesCalendarIdentityUserRole>();

    and similar code.

    It has to be 

    public virtual List<EmployeesCalendarIdentityUserRole> UserRoles { get; set; }

    without the new part

    Posted 318 days ago by Vagelis
Someone is typing...

Post a Reply

You must be logged in to add a new post.
Number of online users: 0
An error has occurred. This application may no longer respond until reloaded. Reload 🗙