應用程式角色.cs:
public class ApplicationRole : IdentityRole<Guid>
{
public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
}
應用程式背景關系:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid, IdentityUserClaim<Guid>,
ApplicationUserRole, IdentityUserLogin<Guid>,
IdentityRoleClaim<Guid>, IdentityUserToken<Guid>>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
...
}
uj5u.com熱心網友回復:
如果不運行一些代碼,我真的不能說問題出在哪里,但我可以向您展示我的實作,也許它會響起。這是我的版本:
public class SessionDbContext : IdentityDbContext<MachineUserIdentity, IdentityRole<Guid>, Guid>
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Default users
modelBuilder.ApplyConfiguration(new IdentityUserModelConfig());
// Default roles
modelBuilder.ApplyConfiguration(new IdentityRoleModelConfig());
// User claims
modelBuilder.ApplyConfiguration(new IdentityUserClaimsModelConfig());
// Role claims
modelBuilder.ApplyConfiguration(new IdentityRoleClaimsModelConfig());
// User roles assignment
modelBuilder.ApplyConfiguration(new IdentityUserRoleModelConfig());
}
}
我已經創建了一個單獨的 Foreach 資料表,IEntityTypeConfiguration但它不應該改變任何東西。以下是用戶、角色和用戶角色的實作:
IEntityTypeConfiguration<MachineUserIdentity>與MachineUserIdentity繼承IdentityUser<Guid>:
public void Configure(EntityTypeBuilder<MachineUserIdentity> builder)
{
// Seed default roles
builder.HasData(SeedHelpers.DefaultUsers);
}
IEntityTypeConfiguration<IdentityRole<Guid>>:
public void Configure(EntityTypeBuilder<IdentityRole<Guid>> builder)
{
// Seed default roles
builder.HasData(SeedHelpers.GenerateDefaultRoles());
}
IEntityTypeConfiguration<IdentityUserRole<Guid>>:
public void Configure(EntityTypeBuilder<IdentityUserRole<Guid>> builder)
{
// Seed default roles
builder.HasData(SeedHelpers.GenerateUserRolesAssignment());
}
與您正在做的事情非常相似。最后,我有一個播種助手類,我在其中定義如下資料:
internal const string GUID_USER_OPERATOR = "491a282c-3af1-4d45-b6a1-6014b8195744";
internal const string GUID_USER_SERVICE = "337acfd6-fde7-4d5c-9c0b-08fed843a3ed";
internal const string GUID_ROLE_OPERATOR = "d80a2a14-78a7-4e9d-b228-1cd259bd8cd3";
internal const string GUID_ROLE_SERVICE = "69605900-4fb1-4558-a9d4-6bdf3f184819";
// Password do not belong here, move them to a key vault
// This is just for demo purposes
internal const string ID_DEFAULT_ACCOUNT = "ADMIN";
internal const string ID_DEFAULT_PASSWORD = "ADMIN";
internal const string ID_SERVICE_ACCOUNT = "SERVICE";
internal const string ID_SERVICE_PASSWORD = "SERVICE1234";
internal static List<MachineUserIdentity> DefaultUsers = new()
{
new()
{
Id = Guid.Parse(GUID_USER_OPERATOR),
UserName = ID_DEFAULT_ACCOUNT,
NormalizedUserName = ID_DEFAULT_ACCOUNT,
Role = MachineRoleId.Operator.ToString(),
PasswordHash = hasher.HashPassword(null, ID_DEFAULT_PASSWORD),
},
new()
{
Id = Guid.Parse(GUID_USER_SERVICE),
UserName = ID_SERVICE_ACCOUNT,
NormalizedUserName = ID_SERVICE_ACCOUNT,
Role = MachineRoleId.Service.ToString(),
PasswordHash = hasher.HashPassword(null, ID_SERVICE_PASSWORD),
}
};
internal static IdentityRole<Guid>[] GenerateDefaultRoles()
{
return new[]
{
new(MachineRoleId.Operator.ToString())
{
Id = Guid.Parse(GUID_ROLE_OPERATOR),
Name = MachineRoleId.Operator.ToString(),
NormalizedName = MachineRoleId.Operator.ToString().ToUpper(),
},
new IdentityRole<Guid>
{
Id = Guid.Parse(GUID_ROLE_SERVICE),
Name = MachineRoleId.Service.ToString(),
NormalizedName = MachineRoleId.Service.ToString().ToUpper(),
}
};
}
internal static IdentityUserRole<Guid>[] GenerateUserRolesAssignment()
{
return new[]
{
new()
{
RoleId = Guid.Parse(GUID_ROLE_OPERATOR),
UserId = Guid.Parse(GUID_USER_OPERATOR),
},
new IdentityUserRole<Guid>
{
RoleId = Guid.Parse(GUID_ROLE_SERVICE),
UserId = Guid.Parse(GUID_USER_SERVICE),
}
};
}
我想除了我使用硬編碼的 GUID(我自己選擇在所有目標機器上使用相同的識別符號)并且我沒有像你一樣明確宣告 UserRole 表的鍵之外,沒有太大區別。
希望這可以幫助 ;)
uj5u.com熱心網友回復:
不確定這是否能解決您的問題,但我注意到您正在為 ADMIN_ID 分配新的 GUID 值,然后基本上將相同的值傳遞給 ROLE_ID。為 ROLE_ID 分配一個新的唯一值,然后重試種子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414967.html
標籤:
