From ee4395207592ea312fc16e21a3bef40131b7cd55 Mon Sep 17 00:00:00 2001 From: wuweilai <824255785@qq.com> Date: Wed, 29 Jun 2022 09:40:59 +0800 Subject: [PATCH 1/6] fix(oidc):fix list removeRange error bug --- .../Utils/CollectionExtensions.cs | 4 ++-- .../ServiceCollectionExtensions.cs | 2 +- src/BuildingBlocks/MASA.BuildingBlocks | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Utils/CollectionExtensions.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Utils/CollectionExtensions.cs index f4f63f068..b52bd7fb3 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Utils/CollectionExtensions.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Utils/CollectionExtensions.cs @@ -28,7 +28,7 @@ public static void Remove(this ICollection collection, T data, Func(this ICollection collection, IEnumerable datas, Func keySelector) { - var oldDatas = collection.Where(item => datas.Any(data => keySelector(data).Equals(keySelector(item)))); + var oldDatas = collection.Where(item => datas.Any(data => keySelector(data).Equals(keySelector(item)))).ToList(); if (oldDatas.Count() > 0) { foreach (var oldData in oldDatas) @@ -40,7 +40,7 @@ public static void RemoveRange(this ICollection collection, IEnumerable public static void Remove(this ICollection collection, Func condition) { - var datas = collection.Where(condition); + var datas = collection.Where(condition).ToList(); if(datas.Count() > 0) { foreach (var data in datas) diff --git a/src/BasicAbility/Masa.Contrib.BasicAbility.Auth/ServiceCollectionExtensions.cs b/src/BasicAbility/Masa.Contrib.BasicAbility.Auth/ServiceCollectionExtensions.cs index 96d36313f..03c910b79 100644 --- a/src/BasicAbility/Masa.Contrib.BasicAbility.Auth/ServiceCollectionExtensions.cs +++ b/src/BasicAbility/Masa.Contrib.BasicAbility.Auth/ServiceCollectionExtensions.cs @@ -8,7 +8,7 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddAuthClient(this IServiceCollection services, string authServiceBaseAddress) { ArgumentNullException.ThrowIfNull(authServiceBaseAddress, nameof(authServiceBaseAddress)); -#warning modify + services.AddSingleton(); return services.AddAuthClient(callerOptions => { diff --git a/src/BuildingBlocks/MASA.BuildingBlocks b/src/BuildingBlocks/MASA.BuildingBlocks index 75a5c0506..5e6894f95 160000 --- a/src/BuildingBlocks/MASA.BuildingBlocks +++ b/src/BuildingBlocks/MASA.BuildingBlocks @@ -1 +1 @@ -Subproject commit 75a5c050601d8a37d2f10bac59b600af2780f34d +Subproject commit 5e6894f95a5e3582981616c4a015c6741d0e23db From f3cdeb28cc7cdc73b2439585395fa6febb5fa11d Mon Sep 17 00:00:00 2001 From: wuweilai <824255785@qq.com> Date: Wed, 29 Jun 2022 15:04:04 +0800 Subject: [PATCH 2/6] feat(oidc):clientCache add GetListAsync --- .../Caches/ClientCache.cs | 7 +++++++ src/BuildingBlocks/MASA.BuildingBlocks | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Caches/ClientCache.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Caches/ClientCache.cs index 3e9acd125..3cb9e950a 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Caches/ClientCache.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/Caches/ClientCache.cs @@ -17,6 +17,13 @@ public ClientCache(IMemoryCacheClient memoryCacheClient) return await _memoryCacheClient.GetAsync(FormatKey(clientId)); } + public async Task> GetListAsync(IEnumerable clientIds) + { + var keys = clientIds.Select(clientId => FormatKey(clientId)).ToArray(); + var clients = await _memoryCacheClient.GetListAsync(keys); + return clients.Where(client => client is not null).ToList()!; + } + public async Task SetAsync(Client client) { await _memoryCacheClient.SetAsync(FormatKey(client), client.ToModel()); diff --git a/src/BuildingBlocks/MASA.BuildingBlocks b/src/BuildingBlocks/MASA.BuildingBlocks index 5e6894f95..c19f0f87f 160000 --- a/src/BuildingBlocks/MASA.BuildingBlocks +++ b/src/BuildingBlocks/MASA.BuildingBlocks @@ -1 +1 @@ -Subproject commit 5e6894f95a5e3582981616c4a015c6741d0e23db +Subproject commit c19f0f87fb185a12bae9b238f82d68c4f91cdb02 From cac97e6483ec35bd8f4ae6fcc937d175f3147f48 Mon Sep 17 00:00:00 2001 From: wuweilai <824255785@qq.com> Date: Wed, 29 Jun 2022 16:03:49 +0800 Subject: [PATCH 3/6] feat(oidc):add oidc readme --- .../README.md | 47 ++++++++++++++++++ .../README.zh-CN.md | 47 ++++++++++++++++++ .../README.md | 49 +++++++++++++++++++ .../README.zh-CN.md | 49 +++++++++++++++++++ .../README.md | 39 +++++++++++++++ .../README.zh-CN.md | 39 +++++++++++++++ src/BuildingBlocks/MASA.BuildingBlocks | 2 +- 7 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md create mode 100644 src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.zh-CN.md create mode 100644 src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md create mode 100644 src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md create mode 100644 src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.md create mode 100644 src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.zh-CN.md diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md new file mode 100644 index 000000000..d804c9bc4 --- /dev/null +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md @@ -0,0 +1,47 @@ +[中](README.zh-CN.md) | EN + +## Masa.Contrib.Authentication.Oidc.Cache.Storage + +Effect: + +Oidc Resource and Client data are provided through the IClientStore and IResourceStore + +```c# +├── IClientStore +├── IResourceStore +``` + +Example: + +```C# +Install-Package Masa.Contrib.Authentication.Oidc.Cache.Storage +``` + +```C# +builder.Services.AddOidcCacheStorage(nnew RedisConfigurationOptions +{ + Servers = new List + { + new RedisServerOptions + { + Host="127.0.0.1", + Port=6379 + } + }, + DefaultDatabase = 0, + Password = "", +}); +``` + +How to use: + +```c# +var app = builder.Build(); + +app.MapGet("/GetClient", async ([FromServices] IClientStore store) => +{ + return await store.FindClientByIdAsync("clientId"); +}); + +app.Run(); +``` diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.zh-CN.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.zh-CN.md new file mode 100644 index 000000000..7d050dabb --- /dev/null +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.zh-CN.md @@ -0,0 +1,47 @@ +中 | [EN](README.md) + +## Masa.Contrib.Authentication.Oidc.Cache.Storag + +作用: + +通过IClientStore和IResourceStore获取资源和客户端的相关数据 + +```c# +├── IClientStore +├── IResourceStore +``` + +用例: + +```C# +Install-Package Masa.Contrib.Authentication.Oidc.Cache.Storag +``` + +```C# +builder.Services.AddOidcCacheStorage(nnew RedisConfigurationOptions +{ + Servers = new List + { + new RedisServerOptions + { + Host="127.0.0.1", + Port=6379 + } + }, + DefaultDatabase = 0, + Password = "", +}); +``` + +如何使用: + +```c# +var app = builder.Build(); + +app.MapGet("/GetClient", async ([FromServices] IClientStore store) => +{ + return await store.FindClientByIdAsync("clientId"); +}); + +app.Run(); +``` diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md new file mode 100644 index 000000000..0a656d75f --- /dev/null +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md @@ -0,0 +1,49 @@ +[中](README.zh-CN.md) | EN + +## Masa.Contrib.Authentication.Oidc.Cache + +Effect: + +Manipulate resources and client-related data through a level 2 cache + +```c# +├── ApiResourceCache +├── ApiScopeCache +├── ClientCache +├── IdentityResourceCache +``` + +Example: + +```C# +Install-Package Masa.Contrib.Authentication.Oidc.Cache +``` + +```C# +builder.Services.AddOidcCache(nnew RedisConfigurationOptions +{ + Servers = new List + { + new RedisServerOptions + { + Host="127.0.0.1", + Port=6379 + } + }, + DefaultDatabase = 0, + Password = "", +}); +``` + +How to use: + +```c# +var app = builder.Build(); + +app.MapGet("/GetClient", async ([FromServices] IClientCache cache) => +{ + return await cache.GetAsync("clientId"); +}); + +app.Run(); +``` diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md new file mode 100644 index 000000000..0c911de13 --- /dev/null +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md @@ -0,0 +1,49 @@ +中 | [EN](README.md) + +## Masa.Contrib.Authentication.Oidc.Cache + +作用: + +通过二级缓存操作资源和客户端的相关数据 + +```c# +├── ApiResourceCache +├── ApiScopeCache +├── ClientCache +├── IdentityResourceCache +``` + +用例: + +```C# +Install-Package Masa.Contrib.Authentication.Oidc.Cache +``` + +```C# +builder.Services.AddOidcCache(nnew RedisConfigurationOptions +{ + Servers = new List + { + new RedisServerOptions + { + Host="127.0.0.1", + Port=6379 + } + }, + DefaultDatabase = 0, + Password = "", +}); +``` + +如何使用: + +```c# +var app = builder.Build(); + +app.MapGet("/GetClient", async ([FromServices] IClientCache cache) => +{ + return await cache.GetAsync("clientId"); +}); + +app.Run(); +``` diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.md new file mode 100644 index 000000000..cfa90b183 --- /dev/null +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.md @@ -0,0 +1,39 @@ +[中](README.zh-CN.md) | EN + +## Masa.Contrib.Authentication.Oidc.EntityFrameworkCore + +Effect: + +Use the Repository to operate the Oidc database + +```c# +├── ApiResourceRepository +├── ApiScopeRepository +├── ClientRepository +├── IdentityResourceRepository +├── UserClaimRepository +``` + +Example: + +```C# +Install-Package Masa.Contrib.Authentication.Oidc.EntityFrameworkCore +``` + +```C# +builder.Services.AddOidcDbContext(option => option.UseSqlServer("ConnectionString", + b => b.MigrationsAssembly(migrationsAssembly))); +``` + +How to use: + +```c# +var app = builder.Build(); + +app.MapGet("/GetClients", async ([FromServices] IClientRepository repository) => +{ + return await repository.GetListAsync(); +}); + +app.Run(); +``` diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.zh-CN.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.zh-CN.md new file mode 100644 index 000000000..20c85efa3 --- /dev/null +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/README.zh-CN.md @@ -0,0 +1,39 @@ +中 | [EN](README.md) + +## Masa.Contrib.Authentication.Oidc.EntityFrameworkCore + +作用: + +通过Repository操作Oidc数据库 + +```c# +├── ApiResourceRepository +├── ApiScopeRepository +├── ClientRepository +├── IdentityResourceRepository +├── UserClaimRepository +``` + +用例: + +```C# +Install-Package Masa.Contrib.Authentication.Oidc.EntityFrameworkCore +``` + +```C# +builder.Services.AddOidcDbContext(option => option.UseSqlServer("ConnectionString", + b => b.MigrationsAssembly(migrationsAssembly))); +``` + +如何使用: + +```c# +var app = builder.Build(); + +app.MapGet("/GetClients", async ([FromServices] IClientRepository repository) => +{ + return await repository.GetListAsync(); +}); + +app.Run(); +``` diff --git a/src/BuildingBlocks/MASA.BuildingBlocks b/src/BuildingBlocks/MASA.BuildingBlocks index c19f0f87f..c32612ca5 160000 --- a/src/BuildingBlocks/MASA.BuildingBlocks +++ b/src/BuildingBlocks/MASA.BuildingBlocks @@ -1 +1 @@ -Subproject commit c19f0f87fb185a12bae9b238f82d68c4f91cdb02 +Subproject commit c32612ca5b52b3660d242cd65557460e5636b2a2 From f56c9f67b885da2d2bef0357a66cd680bdc17ed0 Mon Sep 17 00:00:00 2001 From: wuweilai <824255785@qq.com> Date: Thu, 30 Jun 2022 09:47:18 +0800 Subject: [PATCH 4/6] feat(oidc):oidc use business dbContext --- .../Caches/SyncCache.cs | 6 ++--- .../DbContexts/OidcDbContext.cs | 11 ++++----- .../Repositories/ApiResourceRepository.cs | 19 +++++++-------- .../Repositories/ApiScopeRepository.cs | 19 +++++++-------- .../Repositories/ClientRepository.cs | 19 +++++++-------- .../IdentityResourceRepository.cs | 24 +++++++++---------- .../Repositories/UserClaimRepository.cs | 19 +++++++-------- .../ServiceCollectionExtensions.cs | 4 ++-- 8 files changed, 55 insertions(+), 66 deletions(-) diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Caches/SyncCache.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Caches/SyncCache.cs index 936e9c3ad..0bcd1329f 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Caches/SyncCache.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Caches/SyncCache.cs @@ -9,7 +9,7 @@ public class SyncCache IApiResourceCache _apiResourceCache; IApiScopeCache _apiScopeCache; IIdentityResourceCache _identityResourceCache; - OidcDbContext _context; + DbContext _context; public SyncCache(IClientCache clientCache, IApiResourceCache apiResourceCache, IApiScopeCache apiScopeCache, IIdentityResourceCache identityResourceCache, OidcDbContext context) { @@ -17,7 +17,7 @@ public SyncCache(IClientCache clientCache, IApiResourceCache apiResourceCache, I _apiResourceCache = apiResourceCache; _apiScopeCache = apiScopeCache; _identityResourceCache = identityResourceCache; - _context = context; + _context = context.Dbcontext; } internal async Task SyncApiResourceCacheAsync(int id) @@ -56,7 +56,7 @@ internal async Task RemoveIdentityResourceCacheAsync(IdentityResource identityRe await _identityResourceCache.RemoveAsync(identityResource); } - private async Task ResetAsync() + public async Task ResetAsync() { var clients = await ClientQuery().ToListAsync(); var apiScopes = await ApiScopeQuery().ToListAsync(); diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs index 3165b482b..3359415e2 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs @@ -3,15 +3,12 @@ namespace Masa.Contrib.Authentication.Oidc.EntityFrameworkCore.DbContexts; -public class OidcDbContext : DbContext +public class OidcDbContext { - public OidcDbContext(DbContextOptions options) : base(options) - { - } + public DbContext Dbcontext { get; set; } - protected override void OnModelCreating(ModelBuilder modelBuilder) + public OidcDbContext(DbContext dbcontext) { - modelBuilder.HasDefaultSchema("oidc"); - modelBuilder.ApplyConfigurationsFromAssembly(typeof(OidcDbContext).Assembly); + Dbcontext = dbcontext; } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs index 38868fa1e..3ff52f4bd 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs @@ -6,12 +6,14 @@ namespace Masa.Contrib.Authentication.Oidc.EntityFrameworkCore.Repositories; public class ApiResourceRepository : IApiResourceRepository { SyncCache _cache; - OidcDbContext _context; + DbContext _context; + IRepository _repository; - public ApiResourceRepository(SyncCache cache, OidcDbContext context) + public ApiResourceRepository(SyncCache cache, OidcDbContext context, IRepository repository) { _cache = cache; _context = context; + _repository = repository; } public async Task> GetPaginatedListAsync(int page, int pageSize, Expression>? condition = null) @@ -66,24 +68,21 @@ public async ValueTask AddAsync(ApiResource apiResource) if (exist) throw new UserFriendlyException($"ApiResource with name {apiResource.Name} already exists"); - var newApiResource = await _context.AddAsync(apiResource); - await _context.SaveChangesAsync(); + var newApiResource = await _repository.AddAsync(apiResource); await _cache.SyncApiResourceCacheAsync(apiResource.Id); - return newApiResource.Entity; + return newApiResource; } public async Task UpdateAsync(ApiResource apiResource) { - var newApiResource = _context.Update(apiResource); - await _context.SaveChangesAsync(); + var newApiResource = await _repository.UpdateAsync(apiResource); await _cache.SyncApiResourceCacheAsync(apiResource.Id); - return newApiResource.Entity; + return newApiResource; } public async Task RemoveAsync(ApiResource apiResource) { - _context.Remove(apiResource); - await _context.SaveChangesAsync(); + await _repository.RemoveAsync(apiResource); await _cache.RemoveApiResourceCacheAsync(apiResource); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs index 9f4d3039b..db4f59aae 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs @@ -6,12 +6,14 @@ namespace Masa.Contrib.Authentication.Oidc.EntityFrameworkCore.Repositories; public class ApiScopeRepository : IApiScopeRepository { SyncCache _cache; - OidcDbContext _context; + DbContext _context; + IRepository _repository; - public ApiScopeRepository(SyncCache cache, OidcDbContext context) + public ApiScopeRepository(SyncCache cache, OidcDbContext context, IRepository repository) { _cache = cache; _context = context; + _repository = repository; } public async Task> GetPaginatedListAsync(int page, int pageSize, Expression>? condition = null) @@ -64,24 +66,21 @@ public async ValueTask AddAsync(ApiScope apiScope) if (exist) throw new UserFriendlyException($"ApiScope with name {apiScope.Name} already exists"); - var newApiScope = await _context.AddAsync(apiScope); - await _context.SaveChangesAsync(); + var newApiScope = await _repository.AddAsync(apiScope); await _cache.SyncApiScopeCacheAsync(apiScope.Id); - return newApiScope.Entity; + return newApiScope; } public async Task UpdateAsync(ApiScope apiScope) { - var newApiScope = _context.Update(apiScope); - await _context.SaveChangesAsync(); + var newApiScope = await _repository.UpdateAsync(apiScope); await _cache.SyncApiScopeCacheAsync(apiScope.Id); - return newApiScope.Entity; + return newApiScope; } public async Task RemoveAsync(ApiScope apiScope) { - _context.Remove(apiScope); - await _context.SaveChangesAsync(); + await _repository.RemoveAsync(apiScope); await _cache.RemoveApiScopeCacheAsync(apiScope); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs index 0e622d7d8..179a9d30f 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs @@ -6,12 +6,14 @@ namespace Masa.Contrib.Authentication.Oidc.EntityFrameworkCore.Repositories; public class ClientRepository : IClientRepository { IClientCache _cache; - OidcDbContext _context; + DbContext _context; + IRepository _repository; - public ClientRepository(IClientCache cache, OidcDbContext context) + public ClientRepository(IClientCache cache, OidcDbContext context, IRepository repository) { _cache = cache; _context = context; + _repository = repository; } public async Task> GetPaginatedListAsync(int page, int pageSize, Expression>? condition = null) @@ -65,26 +67,23 @@ public async Task GetCountAsync(Expression> predicate) public async ValueTask AddAsync(Client client) { - var newClient = await _context.AddAsync(client); - await _context.SaveChangesAsync(); + var newClient = await _repository.AddAsync(client); var detail = await GetDetailAsync(client.Id); await _cache.SetAsync(detail!); - return newClient.Entity; + return newClient; } public async Task UpdateAsync(Client client) { - var newClient = _context.Update(client); - await _context.SaveChangesAsync(); + var newClient = await _repository.UpdateAsync(client); var detail = await GetDetailAsync(client.Id); await _cache.SetAsync(detail!); - return newClient.Entity; + return newClient; } public async Task RemoveAsync(Client client) { - _context.Remove(client); - await _context.SaveChangesAsync(); + await _repository.RemoveAsync(client); await _cache.RemoveAsync(client); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs index eba523d3d..ec69d62b1 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs @@ -6,12 +6,14 @@ namespace Masa.Contrib.Authentication.Oidc.EntityFrameworkCore.Repositories; public class IdentityResourceRepository : IIdentityResourceRepository { SyncCache _cache; - OidcDbContext _context; + DbContext _context; + IRepository _repository; - public IdentityResourceRepository(SyncCache cache, OidcDbContext context) + public IdentityResourceRepository(SyncCache cache, OidcDbContext context, IRepository repository) { _cache = cache; _context = context; + _repository = repository; } public async Task> GetPaginatedListAsync(int page, int pageSize, Expression>? condition = null) @@ -62,25 +64,22 @@ public async ValueTask AddAsync(IdentityResource identityResou if (exist) throw new UserFriendlyException($"IdentityResource with name {identityResource.Name} already exists"); - var newIdentityResource = await _context.AddAsync(identityResource); - await _context.SaveChangesAsync(); + var newIdentityResource = await _repository.AddAsync(identityResource); await _cache.SyncIdentityResourceCacheAsync(identityResource.Id); - return newIdentityResource.Entity; + return newIdentityResource; } public async Task UpdateAsync(IdentityResource identityResource) { - var newIdentityResource = _context.Update(identityResource); - await _context.SaveChangesAsync(); + var newIdentityResource = await _repository.UpdateAsync(identityResource); await _cache.SyncIdentityResourceCacheAsync(identityResource.Id); - return newIdentityResource.Entity; + return newIdentityResource; } public async Task RemoveAsync(IdentityResource identityResource) { - _context.Remove(identityResource); - await _context.SaveChangesAsync(); + await _repository.RemoveAsync(identityResource); await _cache.RemoveIdentityResourceCacheAsync(identityResource); } @@ -96,17 +95,16 @@ public async Task AddStandardIdentityResourcesAsync() { existData.Update(identityResource.DisplayName, identityResource.Description ?? "", true, identityResource.Required, identityResource.Emphasize, identityResource.ShowInDiscoveryDocument, true); existData.BindUserClaims(userClaimIds); - _context.Update(existData); + await _repository.UpdateAsync(existData); } else { existData = new IdentityResource(identityResource.Name, identityResource.DisplayName, identityResource.Description ?? "", true, identityResource.Required, identityResource.Enabled, identityResource.ShowInDiscoveryDocument, true); existData.BindUserClaims(userClaimIds); - await _context.AddAsync(existData); + await _repository.AddAsync(existData); } syncIdentityResources.Add(existData); } - await _context.SaveChangesAsync(); await _cache.SyncIdentityResourceCacheAsync(syncIdentityResources.Select(idrs => idrs.Id).ToArray()); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/UserClaimRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/UserClaimRepository.cs index 545f0af8c..f49a2548e 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/UserClaimRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/UserClaimRepository.cs @@ -5,10 +5,12 @@ namespace Masa.Contrib.Authentication.Oidc.EntityFrameworkCore.Repositories; public class UserClaimRepository : IUserClaimRepository { - OidcDbContext _context; + IRepository _repository; + DbContext _context; - public UserClaimRepository(OidcDbContext context) + public UserClaimRepository(IRepository repository, OidcDbContext context) { + _repository = repository; _context = context; } @@ -59,22 +61,17 @@ public async ValueTask AddAsync(UserClaim userClaim) if (exist) throw new UserFriendlyException($"UserClaim with name {userClaim.Name} already exists"); - var newUserClaim = await _context.AddAsync(userClaim); - await _context.SaveChangesAsync(); - return newUserClaim.Entity; + return await _repository.AddAsync(userClaim); } public async Task UpdateAsync(UserClaim userClaim) { - var newUserClaim = _context.Update(userClaim); - await _context.SaveChangesAsync(); - return newUserClaim.Entity; + return await _repository.UpdateAsync(userClaim); } public async Task RemoveAsync(UserClaim userClaim) { - _context.Remove(userClaim); - await _context.SaveChangesAsync(); + await _repository.RemoveAsync(userClaim); } public async Task AddStandardUserClaimsAsync() @@ -87,6 +84,6 @@ public async Task AddStandardUserClaimsAsync() userClaims.Add(new UserClaim(claim.Key, claim.Value)); } - await _context.AddRangeAsync(userClaims); + await _repository.AddRangeAsync(userClaims); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/ServiceCollectionExtensions.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/ServiceCollectionExtensions.cs index 282ba1423..e45376674 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/ServiceCollectionExtensions.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/ServiceCollectionExtensions.cs @@ -5,9 +5,9 @@ namespace Masa.Contrib.Authentication.Oidc.EntityFrameworkCore; public static class ServiceCollectionExtensions { - public static IServiceCollection AddOidcDbContext(this IServiceCollection services, Action optionsAction) + public static IServiceCollection AddOidcDbContext(this IServiceCollection services) where T : DbContext { - services.AddDbContext(optionsAction); + services.AddScoped(provider => new OidcDbContext(provider.GetRequiredService())); services.AddScoped(); services.AddScoped(); services.AddScoped(); From 0b639800593e38972e9ad3c10324dbcb6c7263a2 Mon Sep 17 00:00:00 2001 From: wuweilai <824255785@qq.com> Date: Thu, 30 Jun 2022 10:35:55 +0800 Subject: [PATCH 5/6] feat(oidc):support business dbContext --- .../DbContexts/OidcDbContext.cs | 5 +++++ .../Repositories/ApiResourceRepository.cs | 3 +++ .../Repositories/ApiScopeRepository.cs | 3 +++ .../Repositories/ClientRepository.cs | 3 +++ .../Repositories/IdentityResourceRepository.cs | 4 ++++ 5 files changed, 18 insertions(+) diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs index 3359415e2..7d39a137c 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/DbContexts/OidcDbContext.cs @@ -11,4 +11,9 @@ public OidcDbContext(DbContext dbcontext) { Dbcontext = dbcontext; } + + public static implicit operator DbContext(OidcDbContext context) + { + return context.Dbcontext; + } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs index 3ff52f4bd..846f2e75d 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiResourceRepository.cs @@ -69,6 +69,7 @@ public async ValueTask AddAsync(ApiResource apiResource) throw new UserFriendlyException($"ApiResource with name {apiResource.Name} already exists"); var newApiResource = await _repository.AddAsync(apiResource); + await _context.SaveChangesAsync(); await _cache.SyncApiResourceCacheAsync(apiResource.Id); return newApiResource; } @@ -76,6 +77,7 @@ public async ValueTask AddAsync(ApiResource apiResource) public async Task UpdateAsync(ApiResource apiResource) { var newApiResource = await _repository.UpdateAsync(apiResource); + await _context.SaveChangesAsync(); await _cache.SyncApiResourceCacheAsync(apiResource.Id); return newApiResource; } @@ -83,6 +85,7 @@ public async Task UpdateAsync(ApiResource apiResource) public async Task RemoveAsync(ApiResource apiResource) { await _repository.RemoveAsync(apiResource); + await _context.SaveChangesAsync(); await _cache.RemoveApiResourceCacheAsync(apiResource); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs index db4f59aae..c85a850ee 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ApiScopeRepository.cs @@ -67,6 +67,7 @@ public async ValueTask AddAsync(ApiScope apiScope) throw new UserFriendlyException($"ApiScope with name {apiScope.Name} already exists"); var newApiScope = await _repository.AddAsync(apiScope); + await _context.SaveChangesAsync(); await _cache.SyncApiScopeCacheAsync(apiScope.Id); return newApiScope; } @@ -74,6 +75,7 @@ public async ValueTask AddAsync(ApiScope apiScope) public async Task UpdateAsync(ApiScope apiScope) { var newApiScope = await _repository.UpdateAsync(apiScope); + await _context.SaveChangesAsync(); await _cache.SyncApiScopeCacheAsync(apiScope.Id); return newApiScope; } @@ -81,6 +83,7 @@ public async Task UpdateAsync(ApiScope apiScope) public async Task RemoveAsync(ApiScope apiScope) { await _repository.RemoveAsync(apiScope); + await _context.SaveChangesAsync(); await _cache.RemoveApiScopeCacheAsync(apiScope); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs index 179a9d30f..7705f911f 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/ClientRepository.cs @@ -68,6 +68,7 @@ public async Task GetCountAsync(Expression> predicate) public async ValueTask AddAsync(Client client) { var newClient = await _repository.AddAsync(client); + await _context.SaveChangesAsync(); var detail = await GetDetailAsync(client.Id); await _cache.SetAsync(detail!); return newClient; @@ -76,6 +77,7 @@ public async ValueTask AddAsync(Client client) public async Task UpdateAsync(Client client) { var newClient = await _repository.UpdateAsync(client); + await _context.SaveChangesAsync(); var detail = await GetDetailAsync(client.Id); await _cache.SetAsync(detail!); return newClient; @@ -84,6 +86,7 @@ public async Task UpdateAsync(Client client) public async Task RemoveAsync(Client client) { await _repository.RemoveAsync(client); + await _context.SaveChangesAsync(); await _cache.RemoveAsync(client); } } diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs index ec69d62b1..48621f5d0 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.EntityFrameworkCore/Repositories/IdentityResourceRepository.cs @@ -65,6 +65,7 @@ public async ValueTask AddAsync(IdentityResource identityResou throw new UserFriendlyException($"IdentityResource with name {identityResource.Name} already exists"); var newIdentityResource = await _repository.AddAsync(identityResource); + await _context.SaveChangesAsync(); await _cache.SyncIdentityResourceCacheAsync(identityResource.Id); return newIdentityResource; } @@ -72,6 +73,7 @@ public async ValueTask AddAsync(IdentityResource identityResou public async Task UpdateAsync(IdentityResource identityResource) { var newIdentityResource = await _repository.UpdateAsync(identityResource); + await _context.SaveChangesAsync(); await _cache.SyncIdentityResourceCacheAsync(identityResource.Id); return newIdentityResource; @@ -80,6 +82,7 @@ public async Task UpdateAsync(IdentityResource identityResourc public async Task RemoveAsync(IdentityResource identityResource) { await _repository.RemoveAsync(identityResource); + await _context.SaveChangesAsync(); await _cache.RemoveIdentityResourceCacheAsync(identityResource); } @@ -105,6 +108,7 @@ public async Task AddStandardIdentityResourcesAsync() } syncIdentityResources.Add(existData); } + await _context.SaveChangesAsync(); await _cache.SyncIdentityResourceCacheAsync(syncIdentityResources.Select(idrs => idrs.Id).ToArray()); } } From b219e3f989c289460ddd5701c44cc96c9c76c5a3 Mon Sep 17 00:00:00 2001 From: wuweilai <824255785@qq.com> Date: Thu, 30 Jun 2022 14:05:10 +0800 Subject: [PATCH 6/6] refactor: refactor code --- .../Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md | 2 +- .../Masa.Contrib.Authentication.Oidc.Cache/README.md | 2 +- .../Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md | 2 +- src/BuildingBlocks/MASA.BuildingBlocks | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md index d804c9bc4..7c54883d0 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache.Storage/README.md @@ -4,7 +4,7 @@ Effect: -Oidc Resource and Client data are provided through the IClientStore and IResourceStore +Use IClientStore and IResourceStore get oidc resources and client data. ```c# ├── IClientStore diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md index 0a656d75f..888728030 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.md @@ -4,7 +4,7 @@ Effect: -Manipulate resources and client-related data through a level 2 cache +Use the second level cache to operate resources and client data. ```c# ├── ApiResourceCache diff --git a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md index 0c911de13..6e29ffc4c 100644 --- a/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md +++ b/src/Authentication/Masa.Contrib.Authentication.Oidc.Cache/README.zh-CN.md @@ -4,7 +4,7 @@ 作用: -通过二级缓存操作资源和客户端的相关数据 +使用二级缓存来操作资源和客户端数据。 ```c# ├── ApiResourceCache diff --git a/src/BuildingBlocks/MASA.BuildingBlocks b/src/BuildingBlocks/MASA.BuildingBlocks index c32612ca5..63dca8be6 160000 --- a/src/BuildingBlocks/MASA.BuildingBlocks +++ b/src/BuildingBlocks/MASA.BuildingBlocks @@ -1 +1 @@ -Subproject commit c32612ca5b52b3660d242cd65557460e5636b2a2 +Subproject commit 63dca8be684c9fadcf21bc6529b2f9dfb7699c22