Still working on getting client credential flow complete, most of the request works but still working on generating the JWT.
This commit is contained in:
parent
1a8c63808a
commit
8782ef39c6
80 changed files with 1331 additions and 414 deletions
|
|
@ -1,18 +1,21 @@
|
|||
using IdentityShroud.Core.Contracts;
|
||||
using IdentityShroud.Core.EFCore;
|
||||
using IdentityShroud.Core.Helpers;
|
||||
using IdentityShroud.Core.Messages.Realm;
|
||||
using IdentityShroud.Core.Model;
|
||||
using IdentityShroud.Core.Security;
|
||||
using IdentityShroud.Core.Security.Keys;
|
||||
using IdentityShroud.Core.Security.Keys.Aes;
|
||||
using IdentityShroud.Core.Security.Keys.Rsa;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace IdentityShroud.Core.Services;
|
||||
|
||||
public record RealmCreateResponse(Guid Id, string Slug, string Name);
|
||||
|
||||
public class RealmService(
|
||||
Db db,
|
||||
IKeyService keyService) : IRealmService
|
||||
IKeyService keyService,
|
||||
IDekEncryptionService dekCryptor,
|
||||
IClock clock) : IRealmService
|
||||
{
|
||||
public async Task<Realm?> FindById(Guid id, CancellationToken ct = default)
|
||||
{
|
||||
|
|
@ -26,7 +29,7 @@ public class RealmService(
|
|||
.SingleOrDefaultAsync(r => r.Slug == slug, ct);
|
||||
}
|
||||
|
||||
public async Task<Result<RealmCreateResponse>> Create(RealmCreateRequest request, CancellationToken ct = default)
|
||||
public async Task<Result<Realm>> Create(RealmCreateRequest request, CancellationToken ct = default)
|
||||
{
|
||||
Realm realm = new()
|
||||
{
|
||||
|
|
@ -35,26 +38,52 @@ public class RealmService(
|
|||
Name = request.Name,
|
||||
};
|
||||
|
||||
realm.Keys.Add(keyService.CreateKey(GetKeyPolicy(realm)));
|
||||
realm.TokenSigningKeys.Add(CreateSigningKey(realm));
|
||||
realm.DataEncryptionKeys.Add(CreateDataEncryptionKey(realm));
|
||||
|
||||
db.Add(realm);
|
||||
await db.SaveChangesAsync(ct);
|
||||
|
||||
return new RealmCreateResponse(
|
||||
realm.Id, realm.Slug, realm.Name);
|
||||
|
||||
return realm;
|
||||
}
|
||||
|
||||
private RealmSigningKey CreateSigningKey(Realm realm)
|
||||
{
|
||||
var k = keyService.CreateKey(GetSigningKeyPolicy(realm));
|
||||
return new RealmSigningKey
|
||||
{
|
||||
Id = RealmSigningKeyId.NewId(),
|
||||
KeyType = k.KeyType,
|
||||
Key = dekCryptor.Encrypt(k.Key.PrivateKey),
|
||||
PublicKeyParameters = k.Key.PublicKeyParameters,
|
||||
CreatedAt = clock.UtcNow(),
|
||||
};
|
||||
}
|
||||
|
||||
private RealmDek CreateDataEncryptionKey(Realm realm)
|
||||
{
|
||||
var k = keyService.CreateKey(GetDataKeyPolicy(realm));
|
||||
return new RealmDek()
|
||||
{
|
||||
Id = DekId.NewId(),
|
||||
Active = true,
|
||||
Algorithm = k.KeyType,
|
||||
KeyData = dekCryptor.Encrypt(k.Key.PrivateKey),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Place holder for getting policies from the realm and falling back to sane defaults when no policies have been set.
|
||||
/// </summary>
|
||||
/// <param name="_"></param>
|
||||
/// <returns></returns>
|
||||
private KeyPolicy GetKeyPolicy(Realm _) => new RsaKeyPolicy();
|
||||
|
||||
private KeyPolicy GetSigningKeyPolicy(Realm _) => new RsaKeyPolicy();
|
||||
private KeyPolicy GetDataKeyPolicy(Realm _) => new AesKeyPolicy();
|
||||
|
||||
public async Task LoadActiveKeys(Realm realm)
|
||||
{
|
||||
await db.Entry(realm).Collection(r => r.Keys)
|
||||
await db.Entry(realm).Collection(r => r.TokenSigningKeys)
|
||||
.Query()
|
||||
.Where(k => k.RevokedAt == null)
|
||||
.LoadAsync();
|
||||
|
|
@ -62,7 +91,7 @@ public class RealmService(
|
|||
|
||||
public async Task LoadDeks(Realm realm)
|
||||
{
|
||||
await db.Entry(realm).Collection(r => r.Deks)
|
||||
await db.Entry(realm).Collection(r => r.DataEncryptionKeys)
|
||||
.Query()
|
||||
.LoadAsync();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue