- У вас есть идентификаторы, которые являются основным местом хранения всей информации о пользователе и его разрешениях.
- Каждое удостоверение может иметь несколько приложений.
- Каждое приложение может иметь несколько разрешений, специфичных для этого приложения.
- Кроме того, каждое приложение может иметь несколько учетных записей, специфичных для этого приложения.
- Кроме того, каждая учетная запись приложения может иметь несколько разрешений приложения.
- Microsoft.NET.Sdk
- Целевой frameworkWork = .NET 7.0
- v7.0.0
Код: Выделить всё
Microsoft.EntityFrameworkCore.Design - v7.0.0
Код: Выделить всё
Microsoft.EntityFrameworkCore.Sqlite
Код: Выделить всё
Identity.cs:
using System.ComponentModel.DataAnnotations;
namespace CodeFirst;
public class Identity
{
[Required]
public int IdentityID { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }
public ICollection? ApplicationAccounts { get; set; }
}
Код: Выделить всё
Application.cs:
namespace CodeFirst;
public class Application
{
// properties
public int ApplicationID { get; set; }
public string? ApplicationName { get; set; }
// Navigation property to ApplicationPrivilege
public ICollection? ApplicationPrivileges { get; set; }
// Navigation property to ApplicationAccount
public ICollection? ApplicationAccounts { get; set; }
// Methods
}
Код: Выделить всё
ApplicationPrivilege.cs:
using System.ComponentModel.DataAnnotations;
namespace CodeFirst;
public class ApplicationPrivilege
{
// properties
[Required]
public int ApplicationPrivilegeID { get; set;}
public string? PrivilegeName { get; set;}
public int ApplicationID { get; set; }
// Navigation property to ApplicationAccount
public ICollection? ApplicationAccounts { get; set; }
public Application Application { set; get; } // Required reference navigation to principal
}
Код: Выделить всё
ApplicationAccount.cs:
using System.ComponentModel.DataAnnotations;
namespace CodeFirst;
public class ApplicationAccount
{
// properties
[Required]
public int ApplicationAccountID { get; set;}
public string? AccountName { get; set;}
public int ApplicationID { get; set; }
public int IdentityID { get; set; }
// Navigation property to ApplicationPrivilege
public ICollection? ApplicationPrivileges { get; set; }
// Navigation property to Identity
public Identity Identity { get; set; }
public Application Application { set; get; } // Required reference navigation to principal
}
Код: Выделить всё
Datacontext.cs:
using Microsoft.EntityFrameworkCore; // CbContext, DbSet
namespace CodeFirst;
public class IAM : DbContext
{
public DbSet? Identities { get; set; }
public DbSet? Applications { get; set;}
public DbSet? ApplicationPrivileges { get; set; }
public DbSet? ApplicationAccounts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string path = Path.Combine(Environment.CurrentDirectory, "CodeFirst.db");
string connection = $"Filename={path}";
WriteLine($"Connection: {connection}");
optionsBuilder.UseSqlite(connection);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Fluent API validation rules
modelBuilder.Entity().Property(i => i.PESEL).IsRequired();
// Populate database with sample data
Identity dgrzejek = new()
{
IdentityID = 1,
FirstName = "Test",
LastName = "One",
PESEL = "12345678900"
};
Identity jbankowy = new()
{
IdentityID = 2,
FirstName = "Test",
LastName = "Two",
PESEL = "12345678900"
};
Identity jtestowy = new()
{
IdentityID = 3,
FirstName = "Test",
LastName = "Three",
PESEL = "12345678900"
};
Application appOne = new()
{
ApplicationID = 1,
ApplicationName = "Application One"
};
Application appTwo = new()
{
ApplicationID = 2,
ApplicationName = "Application Two"
};
ApplicationAccount testOne_AppOne = new()
{
ApplicationAccountID = 1,
AccountName = "testOne_AppOne",
ApplicationID = 2,
IdentityID = 1
};
ApplicationAccount testTwo_AppOne = new()
{
ApplicationAccountID = 2,
AccountName = "testTwo_AppOne",
ApplicationID = 2,
IdentityID = 2
};
ApplicationAccount testThree_AppTwo = new()
{
ApplicationAccountID = 3,
AccountName = "testThree_AppTwo",
ApplicationID = 1,
IdentityID = 3
};
ApplicationPrivilege privOneAppOne = new()
{
ApplicationPrivilegeID = 1,
PrivilegeName = "privOneAppOne",
ApplicationID = 1
};
ApplicationPrivilege privTwoAppOne = new()
{
ApplicationPrivilegeID = 2,
PrivilegeName = "privTwoAppOne",
ApplicationID = 1
};
ApplicationPrivilege privThreeAppOne = new()
{
ApplicationPrivilegeID = 3,
PrivilegeName = "USR_PRE_AP",
ApplicationID = 1
};
ApplicationPrivilege privOneAppTwo = new()
{
ApplicationPrivilegeID = 4,
PrivilegeName = "asco",
ApplicationID = 2
};
modelBuilder.Entity().HasData(dgrzejek, jbankowy, jtestowy);
modelBuilder.Entity().HasData(appOne, appTwo);
modelBuilder.Entity().HasData(testOne_AppOne,testTwo_AppOne);
modelBuilder.Entity().HasData(privOneAppOne,privTwoAppOne,privThreeAppOne,privOneAppTwo);
modelBuilder.Entity()
.HasMany(i => i.ApplicationAccounts)
.WithOne(a => a.Identity)
.IsRequired();
modelBuilder.Entity()
.HasMany(p => p.ApplicationPrivileges)
.WithOne(p => p.Application)
.IsRequired();
modelBuilder.Entity()
.HasMany(p => p.ApplicationAccounts)
.WithOne(p => p.Application)
.IsRequired();
modelBuilder.Entity()
.HasMany(p => p.ApplicationPrivileges)
.WithMany(p => p.ApplicationAccounts)
.UsingEntity(e => e.HasData(
// testOne_AppOne have asco
new { ApplicationAccountsApplicationAccountID = 1, ApplicationPrivilegesApplicationPrivilegeID = 1 }
));
}
}
Код: Выделить всё
ApplicationКод: Выделить всё
ApplicationAccountТекущий подход, который я показываю, действительно работает: я могу извлечь идентификационные данные их учетных записей, узнать, из какого приложения используется эта учетная запись, и разрешения этой учетной записи. Кроме того, я могу просто получить все разрешения для всех приложений. Это позволяет мне определить, какие разрешения конкретный пользователь приложения может получить в будущем.
Хотя это работает, это просто не кажется чистым. Я пробовал найти множество статей о том, как следует строить такую структуру, но не смог сделать ее лучше, и я точно знаю, что мне следует это сделать.
Подробнее здесь: https://stackoverflow.com/questions/786 ... tity-manag
Мобильная версия