Compare commits

...

2 Commits

Author SHA1 Message Date
a23953fe11 Merge pull request 'Support encrypted cache conn strings & update dependencies' (#3) from feature/portfolio-admin-auth into dev
Reviewed-on: #3
2026-02-15 14:23:56 +05:30
2533b5298f Support encrypted cache conn strings & update dependencies
Moved DecryptConnectionString to KBR.Shared.Extensions for reuse and improved configuration access. Added Encryption property to CacheOptions and appsettings for conditional decryption of cache connection strings. Updated ServiceCollectionExtensions to decrypt SQL Server cache connection strings when needed. Upgraded NuGet packages across projects to latest .NET 8/10.0.x versions. Included minor code cleanups and OpenApiSecurityScheme improvements.
2026-02-15 14:22:22 +05:30
9 changed files with 40 additions and 23 deletions

View File

@ -10,10 +10,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Asp.Versioning.Mvc" Version="8.1.1" /> <PackageReference Include="Asp.Versioning.Mvc" Version="8.1.1" />
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" /> <PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.1" />
<PackageReference Include="AutoMapper" Version="15.0.1" /> <PackageReference Include="AutoMapper" Version="16.0.0" />
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" /> <PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.10" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.9" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.9"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.9">

View File

@ -12,7 +12,7 @@ using PortBlog.API.Middleware;
using Serilog; using Serilog;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using KBR.Shared.Extensions;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -131,14 +131,13 @@ builder.Services.AddSwaggerGen(c =>
Scheme = "ApiKeyScheme" Scheme = "ApiKeyScheme"
}); });
var key = new OpenApiSecurityScheme() var key = new OpenApiSecurityScheme
{ {
Reference = new OpenApiReference Reference = new OpenApiReference
{ {
Type = ReferenceType.SecurityScheme, Type = ReferenceType.SecurityScheme,
Id = "ApiKey" Id = "ApiKey"
}, }
In = ParameterLocation.Header
}; };
// JWT Bearer Security Definition // JWT Bearer Security Definition

View File

@ -6,6 +6,7 @@
}, },
"Cache": { "Cache": {
"ConnectionString": "SERVER=192.168.0.197; DATABASE=cv_blog; UID=PortBlogDevUser; PWD=p@$$w0rd1234;Allow User Variables=true;", "ConnectionString": "SERVER=192.168.0.197; DATABASE=cv_blog; UID=PortBlogDevUser; PWD=p@$$w0rd1234;Allow User Variables=true;",
"Encryption": "false",
"Provider": "SqlServer" "Provider": "SqlServer"
}, },
"Jwt": { "Jwt": {

View File

@ -8,10 +8,16 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.4" /> <PackageReference Include="coverlet.collector" Version="8.0.0">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" /> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,5 +1,6 @@
using KBR.Cache.Constants; using KBR.Cache.Constants;
using KBR.Cache.Options; using KBR.Cache.Options;
using KBR.Shared.Extensions;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
@ -20,9 +21,14 @@ namespace KBR.Cache.Extensions
} }
else if (cacheOptions.Provider == CacheProviders.SqlServer) else if (cacheOptions.Provider == CacheProviders.SqlServer)
{ {
var connectionString = cacheOptions.ConnectionString;
if ((bool)cacheOptions.Encryption)
{
connectionString = configuration.DecryptConnectionString(connectionString);
}
services.AddDistributedMySqlCache(options => services.AddDistributedMySqlCache(options =>
{ {
options.ConnectionString = cacheOptions.ConnectionString; options.ConnectionString = connectionString;
options.TableName = "Cache"; options.TableName = "Cache";
}); });
} }

View File

@ -7,14 +7,14 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Caching.SqlServer" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Caching.SqlServer" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Options" Version="10.0.3" />
<PackageReference Include="Pomelo.Extensions.Caching.MySql" Version="2.2.1" /> <PackageReference Include="Pomelo.Extensions.Caching.MySql" Version="2.2.1" />
</ItemGroup> </ItemGroup>

View File

@ -4,6 +4,8 @@
{ {
public string Provider { get; set; } = null!; public string Provider { get; set; } = null!;
public bool? Encryption { get; set; } = false;
public string? ConnectionString { get; set; } public string? ConnectionString { get; set; }
} }
} }

View File

@ -1,12 +1,14 @@
using System.Security.Cryptography; using Microsoft.Extensions.Configuration;
using System.Security.Cryptography;
namespace PortBlog.API.Extensions namespace KBR.Shared.Extensions
{ {
public static class ConfigurationExtensions public static class ConfigurationExtensions
{ {
public static string DecryptConnectionString(this IConfiguration configuration, string encryptedConnectionString) public static string DecryptConnectionString(this IConfiguration configuration, string encryptedConnectionString)
{ {
string keyBase64 = configuration.GetValue<string>("ConnectionStrings:Key").ToString(); // Fix: Use GetSection and Value instead of GetValue (since GetValue is not available on IConfiguration)
string keyBase64 = configuration.GetSection("ConnectionStrings:Key").Value;
string vectorBase64 = encryptedConnectionString.Split(":")[1]; string vectorBase64 = encryptedConnectionString.Split(":")[1];
string cipherText = encryptedConnectionString.Split(":")[0]; string cipherText = encryptedConnectionString.Split(":")[0];

View File

@ -7,7 +7,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.9" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>