Activities of "AI-Bot"

  • In ABP Angular, validation errors (and other HTTP errors) are typically shown via the theme’s HTTP error handler (uses ConfirmationService.error(...) internally). If your server returns an error message that contains HTML, the safest approach is to override the HTTP error handler and force the message to be treated as plain text (i.e., never bind it as HTML / never pass a “safeHtml” object).
  • Concretely: register your own HTTP_ERROR_HANDLER and sanitize/escape the message before showing it.
// error.handler.ts
import { Injector } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';
import { throwError } from 'rxjs';
import { ConfirmationService } from '@abp/ng.theme.shared';

// Minimal HTML escaping (renders tags as text)
function escapeHtml(input: any): string {
  const s = String(input ?? '');
  return s
    .replace(/&/g, '&')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;');
}

export function handleHttpErrors(injector: Injector, httpError: HttpErrorResponse) {
  // Example: specifically handle 400 validation errors
  if (httpError?.status === 400 && httpError.error?.error?.validationErrors?.length) {
    const confirmationService = injector.get(ConfirmationService);

    const rawMessage = httpError.error.error.validationErrors[0].message;
    const rawTitle = httpError.error.error.message;

    return confirmationService.error(
      escapeHtml(rawMessage),   // prevent HTML injection
      escapeHtml(rawTitle),     // prevent HTML injection
      { hideCancelBtn: true, yesText: 'AbpAccount::Close' }
    );
  }

  return throwError(() => httpError);
}
// app.module.ts
import { HTTP_ERROR_HANDLER } from '@abp/ng.theme.shared';
import { handleHttpErrors } from './error.handler';

@NgModule({
  // ...
  providers: [
    { provide: HTTP_ERROR_HANDLER, useValue: handleHttpErrors },
  ],
})
export class AppModule {}

This ensures that even if the backend returns <b>...</b> / <script>...</script> inside a validation message, it will be displayed as text, not executed/interpreted as HTML.

Links (verified):

  • https://abp.io/support/questions/5171
  • https://github.com/abpframework/abp/blob/360a3395aa0e44fb77574ea7eac745e8ba94b82e/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts#L19

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • (1) Is this expected/by-design?
    In ABP’s EF Core save pipeline, modification audit properties are applied based on EntityEntry.State == Modified, not based on “did any non-audit business property change”. So if EF Core marks an entity as Modified (even due to fixup/DetectChanges side effects), ABP will set LastModificationTime / LastModifierId for that entry. There is no documented built-in rule that says “skip stamping if only audit/concurrency properties are dirty”.

  • (2) Supported/documented way to skip audit stamping when only audit/concurrency props are dirty?
    ABP provides a property-level mechanism, but it is for a different scenario: you can mark a specific property with [DisableAuditing(UpdateModificationProps = false)] so changing that property won’t update modification audit props. This does not directly solve your case (where the entity is already Modified for reasons you don’t want).
    Example from docs:

public class MyUser : Entity<Guid>
  {
      public string Name { get; set; }

      [DisableAuditing(UpdateModificationProps = false, PublishEntityEvent = false)]
      public string ReadCount { get; set; }
  }

In your scenario (only audit props appear modified), there is no documented ABP option that automatically ignores/rolls back such “audit-only modifications” at the entity level.

  • (3) Could EF Core / ABP changes be making this more visible?
    Yes, this symptom is consistent with EF Core deciding an entity is Modified due to relationship fixup / FK synchronization / DetectChanges behavior changes across versions. Once EF Core marks Patient as Modified, ABP will treat it as a real update and stamp audit props. ABP itself also has options around “navigation changes” for entity change events, which indicates the framework has had to account for EF Core navigation/FK change detection differences:

    • PublishEntityUpdatedEventWhenNavigationChanges (default true) and related behavior are documented under entity change events.
  • (4) Correct extension point?
    Given there’s no documented switch for “audit-only modified entries”, the most deterministic approach is exactly what you already implemented: intercept in your DbContext save pipeline (e.g., HandlePropertiesBeforeSave) and reset the entry to Unchanged when the only modified properties are audit/concurrency-stamp ones.
    Overriding/replacing IAuditPropertySetter could work, but ABP doesn’t document it as a supported “filter-out audit-only modifications” feature, and without ABP source verification available here, I can’t provide a safe/accurate replacement registration snippet.

Validated references (closest official knobs relevant to this behavior):

  • ABP Audit Logging docs (property-level DisableAuditing(UpdateModificationProps = false)): https://abp.io/docs/10.5/framework/infrastructure/audit-logging
  • ABP entity base classes/audit properties overview: https://abp.io/docs/10.5/framework/architecture/domain-driven-design/entities
  • ABP entity change event option re navigation changes (PublishEntityUpdatedEventWhenNavigationChanges): https://abp.io/docs/10.5/framework/infrastructure/event-bus/local/
  • Related support thread showing ABP/EFC navigation-change handling touchpoints: https://abp.io/support/questions/10057

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • Your follow-up questions are about ABP Commercial licensing behavior after subscription lapse (login eligibility, private NuGet feed access, and whether Development-mode online checks still pass). These are commercial/license terms & account entitlements, and the only definitive/authoritative confirmation must come from Volosoft.

Please contact us at https://abp.io/contact.

(For reference, ABP’s FAQ entry about end-of-license period is here: https://abp.io/faq#what-happens-when-my-license-period-ends)


This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • Given your “heavily modified get-source modules” setup, the safest/lowest-surprise path is:

    1. Upgrade ABP first (9.0.x → 10.6.x) while staying on net9.0, get everything compiling/tests passing.
    2. Then flip TFMs to net10.0 and upgrade the remaining non-ABP dependencies (EF Core 10, ASP.NET Core 10, etc.).
    3. Only after you are stable on ABP 10.6, decide whether to keep the modules as source or move back to NuGet and re-implement customizations via extension points.
  • Do not do “.NET 10 first on ABP 9.0.4” (option b). ABP 9 is tied to the .NET 9 wave; forcing net10 first typically creates a larger, harder-to-debug break surface.

  • Do not do “ABP + net10 in one pass” (option c) for your case. With ~1,000 modified module files, isolating failure domains is critical.


  • Customized Commercial module source (get-source) – what to do
    • There is no official “automatic 3‑way merge” tool in ABP CLI/Studio/Suite that can reliably rebase ~1,000 modified upstream files across a major version jump. In practice, customers do this with standard git workflows:
      • Treat upstream 10.6 module source as “new vendor drop”
      • Apply your changes by 3‑way merge / cherry-pick / manual reconciliation, then fix compile/runtime issues.
    • If you can afford it long-term, the lowest future upgrade cost is generally to move back to NuGet packages and re-implement via ABP’s extension points (entity extension system, service replacement, custom app services, UI customization, etc.). However, since your modifications include deep edits (entities, mappings, permissions, behavior changes), you should assume some of your changes may not be fully expressible via extension points without refactoring. The safest sequencing is:
      1. First reach ABP 10.6 with your current “source modules” approach (so behavior stays as close as possible).
      2. Then do a second project to “de-vendor” modules back to packages and refactor customizations into extension points.

  • Upgrade path: jump vs stepping through versions
    • For ABP Framework, the officially documented major jump you must account for is 9.x → 10.0 (major breaking changes).
    • Practically, with your level of customization, you can still upgrade directly to 10.6, but you must apply the 10.0 migration guide changes (and any later changes you hit during compilation/testing).
    • A stepped upgrade (9.1 → … → 10.6) can reduce diff size per step, but it also multiplies the number of intermediate reconciliations across your customized vendor code. For “vendored + heavily edited”, stepping is not necessarily safer—often it’s just more work.

  • Sequencing ABP vs .NET 10
    • Recommended: (a) Upgrade ABP 9.0.4 → 10.6 first on net9.0, then change to net10.0.
    • Rationale: ABP 10.6 multi-targeting (including net10.0) means you can isolate:
      • ABP API/breaking changes first
      • Then runtime/SDK/EF Core 10 changes second

  • Breaking changes / migration docs (verified links)
    • ABP 9.0 migration guide (useful baseline if you need to normalize 9.0.x):
      https://abp.io/docs/9.0/release-info/migration-guides/abp-9-0
    • ABP 10.0 migration guide (this is the key major jump from 9 → 10):
      https://abp.io/docs/10.6/release-info/migration-guides/abp-10-0

  • Tooling
    • For updating ABP NuGet + NPM packages, use ABP CLI abp update (run at solution root). Verified doc:
      https://abp.io/docs/latest/CLI#update
    • ABP Studio upgrade mechanism (if you use Studio):
      https://abp.io/docs/latest/studio/installation#upgrading

  • PostgreSQL / EF Core 10 note (risk item)
    • There has been at least one reported ecosystem timing issue around EF Core 10 + Npgsql provider stability alignment in early ABP 10 timeframe (Npgsql EF provider lagging stable). This means: when you do the net10/EF Core 10 step, verify the exact Npgsql EF Core provider versions you’ll end up with and be prepared to pin/override if needed. (This is a known class of issue when EF Core major releases land.)

  • Everything else you asked (Commercial modules schema diffs, LeptonX 4→5 specifics, Angular package required versions, OpenIddict/Hangfire breaking changes, “full list of module schema/data migrations between 9.0 and 10.6”, etc.)
    • I don’t have enough verifiable official documentation content in the retrieved sources to provide a definitive consolidated list for those items right now without guessing.

  • If you want Volosoft to advise on license/tooling/support for a migration of a heavily customized commercial-codebase, please contact: https://abp.io/contact

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • Noted — since you’ve already emailed the logs, the remaining actionable checks on your side (that commonly explain 404/504 for /.well-known/openid-configuration behind AWS API Gateway) are:

Solution

  1. Verify API Gateway routing for BOTH GET and OPTIONS
  • Ensure /.well-known/openid-configuration is mapped to the same integration/target as /Account/Login.
  • Make sure OPTIONS is handled:
    • Either forwarded to ECS, or
    • Answered by API Gateway CORS config.
  • A browser will typically preflight (OPTIONS) the discovery endpoint; if OPTIONS gets 404 at the gateway, the Angular OIDC init fails even if GET would work.
  1. Confirm the request actually reaches the AuthServer
  • In the AuthServer logs, for a failing attempt you should see lines like:
    • Request starting ... /.well-known/openid-configuration
    • Request finished ... /.well-known/openid-configuration - <status> ...
  • If there is no Request starting for that path, the problem is definitively API Gateway routing / path rewrite / wrong upstream (not ABP/OpenIddict).
  1. If you see “This server only accepts HTTPS requests” (ID2083) That means the app receives plain HTTP after TLS is terminated at the gateway.
  • Recommended fix: enable forwarded headers in the AuthServer so the app reconstructs the external scheme/host correctly:
using Microsoft.AspNetCore.HttpOverrides;

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
    var app = context.GetApplicationBuilder();

    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders =
            ForwardedHeaders.XForwardedFor |
            ForwardedHeaders.XForwardedProto |
            ForwardedHeaders.XForwardedHost
    });

    // continue with ABP pipeline...
}
  • Also ensure API Gateway forwards:
    • X-Forwarded-Proto: https
    • X-Forwarded-Host: api-product.dev.<company_domain>
  1. Call request (scheduling) For arranging a short call / sharing environment details live, please use: https://abp.io/contact

Sources

  • https://abp.io/docs/latest/deployment/forwarded-headers
  • https://abp.io/docs/latest/solution-templates/layered-web-application/deployment/openiddict-deployment
  • https://abp.io/docs/10.6/modules/openiddict
  • https://abp.io/contact

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • ABP Studio’s “Download source code” feature does not download the Angular npm package sources for modules like CmsKit / CmsKit.Pro as @abp/ng.cms-kit and @volo/abp.ng.cms-kit-pro in the way you expect. That’s why you see:

    • a placeholder for @abp/ng.cms-kit and
    • nothing for @volo/abp.ng.cms-kit-pro.
  • To get the Angular package sources, download the module source code itself (server-side module package), because ABP delivers the related Angular package sources inside the module’s source bundle under an Angular folder.

    • Use ABP Studio / ABP Suite → Modules screen to download the module source; or
    • Use the CLI:
abp get-source Volo.CmsKit
    abp get-source Volo.CmsKit.Pro
  • After download, check the extracted module folder for an Angular directory; that is where the sources for the corresponding Angular packages are included.

  • If you previously downloaded and it’s missing files, clear the local cached zip(s) and retry download (same approach documented for other commercial Angular packages):

    • Delete cached module zip(s) under:
      • %USERPROFILE%\.abp\templates
    • Then re-run abp get-source ... / re-download from the Modules UI.
  • If you are on a license type that doesn’t include source access (only Business/Enterprise can download commercial sources), you won’t be able to download CmsKit.Pro sources; in that case, please contact sales/support.

Links (verified):

  • https://abp.io/support/questions/632
  • https://abp.io/support/questions/673
  • https://abp.io/contact

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • In ABP 10.6 (OpenIddict), when your AuthServer is behind a reverse proxy/API Gateway that terminates TLS, the AuthServer process may see the incoming request as HTTP (or with a different host), unless forwarded headers are applied correctly.

    • This typically results in OpenIddict endpoints (including /.well-known/openid-configuration) behaving unexpectedly in hosted environments (404 via unmatched route/proxy mapping, or 504 due to gateway retries/timeouts), while still working locally.
  • Fix it by ensuring the AuthServer trusts and applies forwarded headers (scheme/host), before ABP endpoints are executed.

Solution

1) Enable forwarded headers in the AuthServer pipeline

In your AuthServer project module (*.HttpApi.Host / AuthServer host module), add UseForwardedHeaders() early in OnApplicationInitialization.

Example:

using Microsoft.AspNetCore.HttpOverrides;
using Volo.Abp;

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
    var app = context.GetApplicationBuilder();

    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders =
            ForwardedHeaders.XForwardedFor |
            ForwardedHeaders.XForwardedProto |
            ForwardedHeaders.XForwardedHost
    });

    // If your proxy is not in KnownNetworks/KnownProxies, you may need:
    // options.KnownNetworks.Clear();
    // options.KnownProxies.Clear();

    // Continue with the standard ABP pipeline...
}

This ensures OpenIddict sees the request as https://api-product.dev.<company_domain> (instead of http://<internal-host>:<port>), so discovery generation/routing matches what the Angular OIDC client expects.

2) Ensure AWS API Gateway forwards the required headers

Configure API Gateway / VPC Link integration so the backend receives:

  • X-Forwarded-Proto: https
  • X-Forwarded-Host: api-product.dev.<company_domain>
  • X-Forwarded-For: <client-ip>

Without these, UseForwardedHeaders() can’t reconstruct the external URL correctly.

3) Don’t rely on custom SetConfigurationEndpointUris unless necessary

ABP/OpenIddict already exposes the discovery endpoint by default. Keeping custom endpoint URI setup is usually fine, but if your proxy rewrites paths or strips /.well-known/*, remove the explicit endpoint overrides and retest to eliminate path-mapping issues at the gateway layer.

4) About the “short call” request

For scheduling/support coordination (non-technical/support process), please contact us at: https://abp.io/contact

Sources

  • https://abp.io/docs/latest/deployment/forwarded-headers
  • https://abp.io/docs/latest/solution-templates/layered-web-application/deployment/openiddict-deployment
  • https://abp.io/docs/10.6/modules/openiddict
  • https://abp.io/contact

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • The error you see in the Identity Management → Users → Actions → Two-Factor dialog is expected when the target user has no available 2FA providers configured. ABP checks whether the user supports two-factor (i.e., has at least one usable provider such as confirmed phone, confirmed email, or an authenticator key). If not, enabling 2FA for that user is rejected with the message:
    “You can not enable two factor for this user because the user does not configured any two factor providers.”

  • Fix (per user):

    1. Ensure at least one provider is available for that user:
      • Confirm the user’s Email (EmailConfirmed = true) and ensure email 2FA is enabled/usable in your setup, or
      • Confirm the user’s Phone number (PhoneNumberConfirmed = true) and ensure SMS provider is configured, or
      • Let the user enroll an Authenticator app (typically done from the user’s own security/2FA page, not from admin user list).
    2. Then enable 2FA from the admin modal; it should save successfully.
  • Fix (tenant-level “Two factor behaviour” not being applied until you click Save):

    • What you observed matches the fact that settings may show defaults in the UI, but are not persisted for the tenant until saved. Ensure you Save the tenant’s Two-Factor settings once right after creating a new tenant (or seed/persist these settings during tenant creation in your own code).
  • About “Forced” / “Disabled” behavior not taking effect after Save:

    • I couldn’t verify an official ABP source explaining a known bug or the exact persistence keys/logic for these specific “Two factor behaviour” options with the tools available (SourceBot repository access is unavailable in this environment), so I can’t provide a definitive, code-verified fix here.

(If you share your ABP version and whether you use Account Pro / which providers (Email/SMS/Authenticator) are configured, I can map the exact expected behavior and where to override/seed it—but I’m not allowed to ask for more info per the response policy.)


This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • Do not upgrade Scriban independently in an ABP 10.0.0 solution. ABP’s Scriban integration (Volo.Abp.TextTemplating.Scriban) is built/tested against the Scriban version that ABP ships with. Forcing Scriban 7.x via your own PackageReference can cause runtime/binding issues that may surface when rendering email templates (so emails fail while other parts still work).

  • What to do about the vulnerability warning (recommended path):

    1. Upgrade ABP packages to a newer patch/minor version where the Scriban dependency is updated/fixed (instead of pinning Scriban yourself).
      • Use abp update or “Upgrade ABP Packages” in ABP Studio.
    2. If you cannot upgrade ABP immediately, and your templates are not editable by untrusted users, the practical exposure is typically low (templates are developer-authored and shipped with the app), but you’ll still see the NuGet audit warning.
  • Mitigation if you allow untrusted users to edit templates (or you want defense-in-depth without changing Scriban yet):

    • Replace/extend ABP’s Scriban rendering engine to remove the vulnerable builtin function (array.insert_at) from the Scriban runtime, so templates can’t trigger the problematic behavior.
    • This keeps your existing ABP/Scriban version but blocks the dangerous function at runtime.
  • Why your emails break after upgrading Scriban to 7:

    • It’s consistent with an unsupported dependency override: ABP code compiled against one Scriban API set, but the app runs with another.

Links (validated):

  • https://abp.io/docs/latest/framework/infrastructure/text-templating/scriban
  • https://abp.io/support/questions/10733
  • https://abp.io/docs/10.0/release-info/migration-guides/abp-10-0

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

  • In ABP 10.4.1, IdentitySessionCleanupBackgroundWorker / session cleanup runs in host context and (as you observed from the generated SQL) the multi-tenant filter limits the delete to TenantId IS NULL. So tenant-owned rows are not deleted unless the worker explicitly changes the tenant context.
  • I couldn’t verify the current implementation in source (SourceBot repository access wasn’t available in this environment), but based on the official module doc and ABP’s established multi-tenancy background-worker guidance, what you’re seeing is consistent with “runs on host unless you change tenant context”.

Supported workaround (recommended): implement your own cleanup worker/service that loops tenants and runs the delete inside ICurrentTenant.Change(...). This is the same pattern ABP support recommends for background workers.

Example implementation (per-tenant + host pass)

using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.MultiTenancy;
using Volo.Abp.TenantManagement; // ITenantRepository (or use ITenantStore if you prefer)
using Volo.Abp.Domain.Repositories;

public class TenantAwareIdentitySessionCleanupWorker : AsyncPeriodicBackgroundWorkerBase
{
    private readonly ICurrentTenant _currentTenant;
    private readonly ITenantRepository _tenantRepository;
    private readonly IIdentitySessionRepository _identitySessionRepository;
    private readonly IdentitySessionCleanupOptions _options;

    public TenantAwareIdentitySessionCleanupWorker(
        AbpAsyncTimer timer,
        ICurrentTenant currentTenant,
        ITenantRepository tenantRepository,
        IIdentitySessionRepository identitySessionRepository,
        IOptions<IdentitySessionCleanupOptions> options)
        : base(timer)
    {
        _currentTenant = currentTenant;
        _tenantRepository = tenantRepository;
        _identitySessionRepository = identitySessionRepository;
        _options = options.Value;

        Timer.Period = (int)_options.CleanupPeriod.TotalMilliseconds; // or your desired period
    }

    protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)
    {
        // 1) Host cleanup
        using (_currentTenant.Change(null))
        {
            await _identitySessionRepository.DeleteAllAsync(_options.InactiveTimeSpan);
        }

        // 2) Tenant cleanup (important for shared-db and database-per-tenant)
        var tenants = await _tenantRepository.GetListAsync(includeDetails: false);

        foreach (var tenant in tenants)
        {
            using (_currentTenant.Change(tenant.Id))
            {
                await _identitySessionRepository.DeleteAllAsync(_options.InactiveTimeSpan);
            }
        }
    }
}

Should you override IdentitySessionCleanupService instead?

  • If your goal is only to fix cleanup behavior, the safest/least invasive approach is a custom worker (as above) and disable/remove the default one if it’s registered by the module (so you don’t run two cleanups).
  • Overriding/replacing the built-in cleanup service can also work, but it’s more likely to be impacted by internal changes in future module updates. A custom worker that calls the repository is usually the most stable workaround.

Is a fix planned / known issue?

  • No verified source available here indicating an official bug report or a scheduled fix for 10.4.1 specifically (I couldn’t access ABP commercial source code or a public issue/PR that confirms it). Practically, you should treat it as a gap and implement the tenant-aware worker.

(links validated)

  • https://abp.io/docs/10.4/modules/identity/session-management
  • https://abp.io/support/questions/2007

This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.

Showing 61 to 70 of 1374 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.8.0-preview. Updated on October 21, 2026, 11:09
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.