From ffcd41f4dc251d4ae202c104cc57f82bb70ae875 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 10:02:11 +0200 Subject: [PATCH 01/10] Add DigitalData.Auth.Claims package dependency Added a reference to the `DigitalData.Auth.Claims` package (version 1.0.1) in the `EnvelopeGenerator.API.csproj` file. This introduces functionality related to handling authentication claims in the project. --- EnvelopeGenerator.API/EnvelopeGenerator.API.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj b/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj index 6a64b510..ca34ffeb 100644 --- a/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj +++ b/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj @@ -30,6 +30,7 @@ + From 99781aeb8aba174baf55d0c592ecbbcf07cf2b1b Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 10:02:25 +0200 Subject: [PATCH 02/10] Enhance authentication and database configuration - Added `using DigitalData.Auth.Claims` to support claims handling. - Improved EF Core DbContext comment for better clarity. - Added logic to dynamically select connection strings based on `MIGRATION_TEST_MODE` or `UseDbMigration` configuration. - Updated `AuthPolicy.Receiver` to include the `"receiver"` role. --- EnvelopeGenerator.API/Program.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.API/Program.cs b/EnvelopeGenerator.API/Program.cs index 448d256a..78213734 100644 --- a/EnvelopeGenerator.API/Program.cs +++ b/EnvelopeGenerator.API/Program.cs @@ -19,6 +19,7 @@ using DigitalData.Core.Abstractions.Security.Extensions; using EnvelopeGenerator.API.Middleware; using NLog.Web; using NLog; +using DigitalData.Auth.Claims; var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger(); logger.Info("Logging initialized!"); @@ -112,7 +113,7 @@ try }); builder.Services.AddOpenApi(); - //AddEF Core dbcontext + //Add EF Core dbcontext var useDbMigration = Environment.GetEnvironmentVariable("MIGRATION_TEST_MODE") == true.ToString() || config.GetValue("UseDbMigration"); var cnnStrName = useDbMigration ? "DbMigrationTest" : "Default"; var connStr = config.GetConnectionString(cnnStrName) @@ -183,7 +184,7 @@ try .AddPolicy(AuthPolicy.Sender, policy => policy.RequireRole(Role.Sender)) .AddPolicy(AuthPolicy.Receiver, policy => - policy.RequireRole(Role.Receiver.Full)) + policy.RequireRole(Role.Receiver.Full, "receiver")) .AddPolicy(AuthPolicy.ReceiverTFA, policy => policy.RequireRole(Role.Receiver.TFA)); From 3eb718f6acf49742e8e53330926fde64042491bb Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 10:23:34 +0200 Subject: [PATCH 03/10] Add CheckReceiver endpoint to AuthController Introduce a new `CheckReceiver` action method in `AuthController`. This method is protected by the `Receiver` authorization policy and handles GET requests to the `check-receiver/{envelopeKey}` route. It accepts an `envelopeKey` parameter from the route and currently returns an HTTP 200 OK response. --- EnvelopeGenerator.API/EnvelopeGenerator.API.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj b/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj index ca34ffeb..8b037d24 100644 --- a/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj +++ b/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj @@ -30,7 +30,7 @@ - + From 938504b2d1c4eb462d6f3e6ea9e4c0a4be683d0b Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 11:47:12 +0200 Subject: [PATCH 04/10] Add per-envelope JWT authentication and validation Introduced a new `EnvelopeReceiverJwt` authentication scheme to support per-envelope JWT validation using cookies specific to envelope keys. Added the `CheckEnvelopeReceiver` endpoint in `AuthController.cs` to validate these tokens, protected by the `AuthPolicy.Receiver` policy. Configured the `EnvelopeReceiverJwt` scheme to dynamically resolve issuer signing keys and validate tokens. Enhanced `JwtBearerEvents.OnMessageReceived` to extract envelope keys from the request path and retrieve tokens from corresponding cookies. Updated the `AuthPolicy.Receiver` policy to use the `EnvelopeReceiverJwt` scheme, ensuring isolated authentication for per-envelope scenarios. Added XML documentation for the `CheckEnvelopeReceiver` method. --- .../Controllers/AuthController.cs | 13 +++++ EnvelopeGenerator.API/Program.cs | 52 ++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.API/Controllers/AuthController.cs b/EnvelopeGenerator.API/Controllers/AuthController.cs index 2ea2daec..b20b134b 100644 --- a/EnvelopeGenerator.API/Controllers/AuthController.cs +++ b/EnvelopeGenerator.API/Controllers/AuthController.cs @@ -73,4 +73,17 @@ public partial class AuthController(IOptions authTokenKeyOptions, => role is not null && !User.IsInRole(role) ? Unauthorized() : Ok(); + + /// + /// Checks whether the caller holds a valid per-envelope receiver token for the given envelope key. + /// The request must carry a cookie named AuthTokenSignFLOWReceiver.{envelopeKey}. + /// + /// The unique envelope key extracted from the route. + /// Valid per-envelope token found. + /// Token is missing, expired or invalid. + [ProducesResponseType(typeof(void), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)] + [Authorize(Policy = AuthPolicy.Receiver)] + [HttpGet("check/envelope/{envelopeKey}")] + public IActionResult CheckEnvelopeReceiver([FromRoute] string envelopeKey) => Ok(); } \ No newline at end of file diff --git a/EnvelopeGenerator.API/Program.cs b/EnvelopeGenerator.API/Program.cs index 78213734..658995e7 100644 --- a/EnvelopeGenerator.API/Program.cs +++ b/EnvelopeGenerator.API/Program.cs @@ -127,6 +127,9 @@ try var authTokenKeys = config.GetOrDefault(); + // Scheme name used for per-envelope receiver JWT authentication. + const string EnvelopeReceiverScheme = "EnvelopeReceiverJwt"; + builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; @@ -161,6 +164,48 @@ try else if (context.Request.Query.TryGetValue(authTokenKeys.QueryString, out var queryStrToken)) context.Token = queryStrToken; } + return Task.CompletedTask; + } + }; + }) + // Per-envelope receiver scheme: reads the JWT from the cookie named + // AuthTokenSignFLOWReceiver.{envelope_key} where envelope_key is the + // last path segment of the request URL. + // This enables simultaneous authentication for multiple envelopes + // within the same browser session. + .AddJwtBearer(EnvelopeReceiverScheme, opt => + { + opt.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuerSigningKey = true, + IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) => + { + var clientParams = deferredProvider.GetOptions(); + var publicKey = clientParams!.PublicKeys.Get(authTokenKeys.Issuer, authTokenKeys.Audience); + return [publicKey.SecurityKey]; + }, + ValidateIssuer = true, + ValidIssuer = authTokenKeys.Issuer, + ValidateAudience = true, + ValidAudience = authTokenKeys.Audience, + }; + + opt.Events = new JwtBearerEvents + { + OnMessageReceived = context => + { + var paths = context.Request.Path.Value?.Split('/', StringSplitOptions.RemoveEmptyEntries); + + // Derive the envelope key from the last route segment: /{envelope_key} + var envelopeKey = paths?.LastOrDefault(); + + if (envelopeKey is not null) + { + var cookieName = CookieNames.GetEnvelopeReceiverCookieName(authTokenKeys.Cookie, envelopeKey); + if (context.Request.Cookies.TryGetValue(cookieName, out var cookieToken) && cookieToken is not null) + context.Token = cookieToken; + } + return Task.CompletedTask; } }; @@ -183,8 +228,13 @@ try policy.RequireRole(Role.Sender, Role.Receiver.Full)) .AddPolicy(AuthPolicy.Sender, policy => policy.RequireRole(Role.Sender)) + // Per-envelope policy: uses the dedicated EnvelopeReceiverJwt scheme so it + // never conflicts with the default JwtBearer scheme. .AddPolicy(AuthPolicy.Receiver, policy => - policy.RequireRole(Role.Receiver.Full, "receiver")) + policy + .AddAuthenticationSchemes(EnvelopeReceiverScheme) + .RequireAuthenticatedUser() + .RequireRole(Role.Receiver.Full, "receiver")) .AddPolicy(AuthPolicy.ReceiverTFA, policy => policy.RequireRole(Role.Receiver.TFA)); From 16493b4594d126847ced9ec50890f5fa049f1f2e Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 12:44:26 +0200 Subject: [PATCH 05/10] Add endpoints for envelope receiver logout functionality Added two new endpoints to `AuthController`: `LogoutEnvelopeReceiver` for removing a specific per-envelope receiver cookie and `LogoutAllEnvelopeReceivers` for clearing all such cookies. Updated `DigitalData.Auth.Claims` package to version 1.0.3. Introduced new `using` directives to support the added functionality. Included XML documentation for the new endpoints to improve code clarity. --- .../Controllers/AuthController.cs | 28 +++++++++++++++++++ .../EnvelopeGenerator.API.csproj | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.API/Controllers/AuthController.cs b/EnvelopeGenerator.API/Controllers/AuthController.cs index b20b134b..6a3500c9 100644 --- a/EnvelopeGenerator.API/Controllers/AuthController.cs +++ b/EnvelopeGenerator.API/Controllers/AuthController.cs @@ -1,3 +1,4 @@ +using DigitalData.Auth.Claims; using EnvelopeGenerator.API.Controllers.Interfaces; using EnvelopeGenerator.API.Models; using EnvelopeGenerator.Domain.Constants; @@ -86,4 +87,31 @@ public partial class AuthController(IOptions authTokenKeyOptions, [Authorize(Policy = AuthPolicy.Receiver)] [HttpGet("check/envelope/{envelopeKey}")] public IActionResult CheckEnvelopeReceiver([FromRoute] string envelopeKey) => Ok(); + + /// + /// Removes the per-envelope receiver cookie for the given envelope key. + /// + /// The unique envelope key whose cookie should be deleted. + /// Cookie successfully deleted. + [ProducesResponseType(typeof(void), StatusCodes.Status200OK)] + [HttpPost("logout/envelope/{envelopeKey}")] + public IActionResult LogoutEnvelopeReceiver([FromRoute] string envelopeKey) + { + var cookieName = CookieNames.GetEnvelopeReceiverCookieName(authTokenKeys.Cookie, envelopeKey); + Response.Cookies.Delete(cookieName); + return Ok(); + } + + /// + /// Removes all per-envelope receiver cookies from the current request. + /// + /// All envelope receiver cookies successfully deleted. + [ProducesResponseType(typeof(void), StatusCodes.Status200OK)] + [HttpPost("logout/envelope")] + public IActionResult LogoutAllEnvelopeReceivers() + { + foreach (var cookieName in Request.Cookies.Keys.Where(k => CookieNames.IsEnvelopeReceiverCookie(k, authTokenKeys.Cookie))) + Response.Cookies.Delete(cookieName); + return Ok(); + } } \ No newline at end of file diff --git a/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj b/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj index 8b037d24..14acf06c 100644 --- a/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj +++ b/EnvelopeGenerator.API/EnvelopeGenerator.API.csproj @@ -30,7 +30,7 @@ - + From e93c7e8bc19a1e25030dd1d7cc0971e100be77d9 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 12:44:51 +0200 Subject: [PATCH 06/10] Add envelope-receiver login endpoint support Added `AddEnvelopeReceiverLoginOperation` to `AuthProxyDocumentFilter` to define a new Swagger operation for the `/api/Auth/envelope-receiver/{key}` endpoint. Introduced the `EnvelopeReceiverLogin` record for the request body. Updated `yarp.json` to configure routing for the new endpoint, ensuring the `cookie` query parameter is always set to `true`. Modified `Apply` to include the new operation in Swagger documentation. --- .../Documentation/AuthProxyDocumentFilter.cs | 53 +++++++++++++++++++ .../Models/EnvelopeReceiverLogin.cs | 7 +++ EnvelopeGenerator.API/yarp.json | 11 ++++ 3 files changed, 71 insertions(+) create mode 100644 EnvelopeGenerator.API/Models/EnvelopeReceiverLogin.cs diff --git a/EnvelopeGenerator.API/Documentation/AuthProxyDocumentFilter.cs b/EnvelopeGenerator.API/Documentation/AuthProxyDocumentFilter.cs index d4ae7480..8cb9c6c0 100644 --- a/EnvelopeGenerator.API/Documentation/AuthProxyDocumentFilter.cs +++ b/EnvelopeGenerator.API/Documentation/AuthProxyDocumentFilter.cs @@ -16,6 +16,12 @@ public sealed class AuthProxyDocumentFilter : IDocumentFilter /// /// public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) + { + AddLoginOperation(swaggerDoc, context); + AddEnvelopeReceiverLoginOperation(swaggerDoc, context); + } + + private static void AddLoginOperation(OpenApiDocument swaggerDoc, DocumentFilterContext context) { const string path = "/api/auth"; @@ -67,4 +73,51 @@ public sealed class AuthProxyDocumentFilter : IDocumentFilter } }; } + + private static void AddEnvelopeReceiverLoginOperation(OpenApiDocument swaggerDoc, DocumentFilterContext context) + { + const string path = "/api/Auth/envelope-receiver/{key}"; + + var bodySchema = context.SchemaGenerator.GenerateSchema(typeof(EnvelopeReceiverLogin), context.SchemaRepository); + + var operation = new OpenApiOperation + { + Summary = "Envelope receiver login (auth-hub proxy)", + Description = "Proxies the envelope receiver login to the auth service. " + + "The `cookie` query parameter is always forwarded as `true` so the auth service sets the per-envelope cookie automatically.", + Tags = [new() { Name = "Auth" }], + Parameters = + { + new OpenApiParameter + { + Name = "key", + In = ParameterLocation.Path, + Required = true, + Schema = new OpenApiSchema { Type = "string" }, + Description = "The unique envelope receiver key." + } + }, + RequestBody = new OpenApiRequestBody + { + Required = false, + Content = + { + ["multipart/form-data"] = new OpenApiMediaType { Schema = bodySchema } + } + }, + Responses = + { + ["200"] = new OpenApiResponse { Description = "OK – per-envelope cookie set by auth service." }, + ["401"] = new OpenApiResponse { Description = "Unauthorized – invalid or missing access code." } + } + }; + + swaggerDoc.Paths[path] = new OpenApiPathItem + { + Operations = + { + [OperationType.Post] = operation + } + }; + } } \ No newline at end of file diff --git a/EnvelopeGenerator.API/Models/EnvelopeReceiverLogin.cs b/EnvelopeGenerator.API/Models/EnvelopeReceiverLogin.cs new file mode 100644 index 00000000..fa53ec61 --- /dev/null +++ b/EnvelopeGenerator.API/Models/EnvelopeReceiverLogin.cs @@ -0,0 +1,7 @@ +namespace EnvelopeGenerator.API.Models; + +/// +/// Request body for the envelope-receiver login endpoint. +/// +/// The access code sent to the receiver. +public record EnvelopeReceiverLogin(string? AccessCode = null); diff --git a/EnvelopeGenerator.API/yarp.json b/EnvelopeGenerator.API/yarp.json index dc38a955..cd16812a 100644 --- a/EnvelopeGenerator.API/yarp.json +++ b/EnvelopeGenerator.API/yarp.json @@ -10,6 +10,17 @@ "Transforms": [ { "PathSet": "/api/auth/sign-flow" } ] + }, + "auth-envelope-receiver-login": { + "ClusterId": "auth-hub", + "Match": { + "Path": "/api/Auth/envelope-receiver/{key}", + "Methods": [ "POST" ] + }, + "Transforms": [ + { "PathPattern": "/api/auth/envelope-receiver/{key}" }, + { "QueryValueParameter": "cookie", "Set": "true" } + ] } }, "Clusters": { From 8876f5c286ef566da758261884424d63b986dfd0 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 13:10:42 +0200 Subject: [PATCH 07/10] Add token validation for envelope key in request path Enhanced token validation logic by introducing an `OnTokenValidated` event handler. This ensures the `envelopeKey` in the request path matches the token's subject (`sub` claim). Added `return Task.CompletedTask;` to complete asynchronous operations. These changes improve security by preventing mismatches or unauthorized access. --- EnvelopeGenerator.API/Program.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/EnvelopeGenerator.API/Program.cs b/EnvelopeGenerator.API/Program.cs index 658995e7..f2478083 100644 --- a/EnvelopeGenerator.API/Program.cs +++ b/EnvelopeGenerator.API/Program.cs @@ -206,6 +206,19 @@ try context.Token = cookieToken; } + return Task.CompletedTask; + }, + OnTokenValidated = context => + { + var paths = context.Request.Path.Value?.Split('/', StringSplitOptions.RemoveEmptyEntries); + var envelopeKey = paths?.LastOrDefault(); + + var sub = context.Principal?.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value + ?? context.Principal?.FindFirst("sub")?.Value; + + if (envelopeKey is null || sub != envelopeKey) + context.Fail("Envelope key in the path does not match the token subject."); + return Task.CompletedTask; } }; From 92b93e862e9476e84e752abd7df12707f20c9619 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 13:37:51 +0200 Subject: [PATCH 08/10] Add GetDocumentOfReceiver endpoint and logging support Updated DocumentController to include a new GetDocumentOfReceiver endpoint for retrieving envelope documents. Added authorization based on the Receiver policy and implemented error handling for invalid or missing EnvelopeId claims. Integrated ILogger to log errors and provide detailed diagnostics. Included necessary namespace imports to support the new functionality. --- .../Controllers/DocumentController.cs | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.API/Controllers/DocumentController.cs b/EnvelopeGenerator.API/Controllers/DocumentController.cs index 5ad42022..41d43fc2 100644 --- a/EnvelopeGenerator.API/Controllers/DocumentController.cs +++ b/EnvelopeGenerator.API/Controllers/DocumentController.cs @@ -1,3 +1,4 @@ +using DigitalData.Auth.Claims; using EnvelopeGenerator.API.Controllers.Interfaces; using EnvelopeGenerator.API.Extensions; using EnvelopeGenerator.Application.Documents.Queries; @@ -5,6 +6,7 @@ using EnvelopeGenerator.Domain.Constants; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System.Threading.Channels; namespace EnvelopeGenerator.API.Controllers; @@ -17,7 +19,7 @@ namespace EnvelopeGenerator.API.Controllers; [Authorize] [ApiController] [Route("api/[controller]")] -public class DocumentController(IMediator mediator, IAuthorizationService authService) : ControllerBase, IAuthController +public class DocumentController(IMediator mediator, IAuthorizationService authService, ILogger logger) : ControllerBase, IAuthController { /// /// @@ -60,4 +62,33 @@ public class DocumentController(IMediator mediator, IAuthorizationService authSe return Unauthorized(); } + + /// + /// + /// + /// + /// + /// + [HttpGet("{envelopeKey}")] + [Authorize(Policy = AuthPolicy.Receiver)] + public async Task GetDocumentOfReceiver(string envelopeKey, CancellationToken cancel) + { + var envelopeIdStr = User.FindFirst(EnvelopeClaimNames.EnvelopeId)?.Value; + + if (!int.TryParse(envelopeIdStr, out int envelopeId)) + { + logger.LogError( + "Inner service error: Failed to parse Envelope ID from claims. Claim '{ClaimName}' had an invalid or missing value: '{ClaimValue}'.", + EnvelopeClaimNames.EnvelopeId, + envelopeIdStr ?? "null"); + + return StatusCode(StatusCodes.Status500InternalServerError, "Inner service error: Invalid envelope claim."); + } + + var senderDoc = await mediator.Send(new ReadDocumentQuery() { EnvelopeId = envelopeId }, cancel); + + return senderDoc.ByteData is byte[] senderDocByte + ? File(senderDocByte, "application/octet-stream") + : NotFound("Document is empty."); + } } \ No newline at end of file From f05189629663c0920f9cb91c783d2a6e5d5f4055 Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 13:46:06 +0200 Subject: [PATCH 09/10] Add API endpoint to retrieve envelope receiver by key Added a new `GetEnvelopeReceiverOfReceiver` method in the `EnvelopeReceiverController` to retrieve an envelope receiver based on the provided `envelopeKey`. The method is secured with the `Receiver` authorization policy and uses the `_mediator.Send` method to process a `ReadEnvelopeReceiverQuery`. Included the `Microsoft.Extensions.Options` namespace to support potential configuration needs. Added XML documentation placeholders for the new method. --- .../Controllers/EnvelopeReceiverController.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/EnvelopeGenerator.API/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.API/Controllers/EnvelopeReceiverController.cs index db8371ee..251c2738 100644 --- a/EnvelopeGenerator.API/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.API/Controllers/EnvelopeReceiverController.cs @@ -14,6 +14,7 @@ using EnvelopeGenerator.Application.Common.SQL; using EnvelopeGenerator.Application.Common.Dto.Receiver; using EnvelopeGenerator.Application.Common.Interfaces.SQLExecutor; using EnvelopeGenerator.API.Extensions; +using EnvelopeGenerator.Domain.Constants; namespace EnvelopeGenerator.API.Controllers; @@ -73,6 +74,24 @@ public class EnvelopeReceiverController : ControllerBase return Ok(result); } + /// + /// + /// + /// + /// + /// + [Authorize(Policy = AuthPolicy.Receiver)] + [HttpGet("{envelopeKey}")] + public async Task GetEnvelopeReceiverOfReceiver([FromRoute] string envelopeKey, CancellationToken cancel) + { + var er = await _mediator.Send(new ReadEnvelopeReceiverQuery() + { + Key = envelopeKey + }, cancel); + + return Ok(er); + } + /// /// Ruft den Namen des zuletzt verwendeten Empfängers basierend auf der angegebenen E-Mail-Adresse ab. /// From b6e63841cd9c90096dfc7c23282b7190e802be3a Mon Sep 17 00:00:00 2001 From: TekH Date: Fri, 29 May 2026 13:47:11 +0200 Subject: [PATCH 10/10] Disable automatic database migrations in appsettings.json The `UseDbMigration` setting in the `appsettings.json` file was updated from `true` to `false`. This change disables automatic application of database migrations, potentially requiring manual intervention or an alternative approach for managing schema updates. --- EnvelopeGenerator.API/appsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.API/appsettings.json b/EnvelopeGenerator.API/appsettings.json index 1fcf433e..25bff075 100644 --- a/EnvelopeGenerator.API/appsettings.json +++ b/EnvelopeGenerator.API/appsettings.json @@ -1,6 +1,6 @@ { "UseSwagger": true, - "UseDbMigration": true, + "UseDbMigration": false, "DiPMode": true, "Logging": { "LogLevel": {