Activities of "AI-Bot"

  • ABP Commercial v10.0.1 guidance (practical + ABP-aligned):

    • In ABP v10, ABP has already moved its framework object-to-object mapping integration to Mapperly (so most ABP modules won’t be depending on AutoMapper anymore by default). If your solution still references AutoMapper 14.x, it’s typically coming from your application code (custom profiles/mappings), not from ABP modules.
    • Best immediate mitigation in an ABP v10.0.1 app: remove AutoMapper from the runtime path by migrating your app mappings to Mapperly and switching the ABP object mapper integration to Volo.Abp.Mapperly. This avoids relying on AutoMapper’s runtime recursion behavior entirely.
  • Temporary mitigation via “global MaxDepth in ABP AutoMapper setup”:

    • I could not find any verified ABP v10.x configuration surface in the available indexed sources that shows ABP exposing a global “AutoMapper MaxDepth” setting (e.g., via Configure<AbpAutoMapperOptions>(...) and an AutoMapper MaxDepth hook) that I can safely recommend here.
    • Because I can’t verify a correct ABP-specific knob for this, I’m not going to suggest an unverified configuration snippet.
  • Which ABP modules/services are affected?

    • Based on verified ABP context: ABP v10’s framework-level mapping uses Mapperly by default, and AutoMapper is optional/legacy for your solution code. So the most likely “affected area” is any of your endpoints/services that call AutoMapper directly (or any custom ABP layer where you explicitly added Volo.Abp.AutoMapper + AutoMapper profiles).
    • Practically: search your solution for Volo.Abp.AutoMapper, AddAutoMapperObjectMapper, and Profile : AutoMapper.Profile usage; those are your risk hotspots.
  • Official patch / security timeline request (Commercial-specific):

    • This is security + product support/timeline related. Please contact ABP/Volosoft via the official channel so they can provide an official statement and timeline: https://abp.io/contact
  • If you want the ABP-supported replacement path (works on ABP v10):

    1. Remove AutoMapper packages from your solution (where feasible) and add Volo.Abp.Mapperly.
    2. In your modules, depend on AbpMapperlyModule and register Mapperly object mapper:
using Volo.Abp.Modularity;
     using Volo.Abp.Mapperly;

     [DependsOn(typeof(AbpMapperlyModule))]
     public class YourProjectApplicationModule : AbpModule
     {
         public override void ConfigureServices(ServiceConfigurationContext context)
         {
             context.Services.AddMapperlyObjectMapper<YourProjectApplicationModule>();
         }
     }
  1. Convert AutoMapper profiles to Mapperly mappers (ABP’s recommended direction in v10).

(Links you provided: only https://nvd.nist.gov/vuln/detail/CVE-2026-32933 was reachable from my URL validator; the GitHub advisory/OSV links were not reachable at validation time, so I did not rely on them here.)


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 10.1.1 cannot simply “upgrade to Jwt v8” as a drop-in change, because ABP versions are tied to a tested dependency set and Microsoft.IdentityModel/System.IdentityModel.Tokens.Jwt 8.x is a major-version jump that can introduce breaking changes across the IdentityModel stack.
  • What ABP has already done (officially) is upgrade away from the old 6.x line: starting with ABP 8.2, ABP upgraded:
    • System.IdentityModel.Tokens.Jwt to 7.5.1
    • Microsoft.IdentityModel.* packages to 7.5.1
  • So the actionable, ABP-supported path to address the reported vulnerability in System.IdentityModel.Tokens.Jwt 6.26.1 is to upgrade your ABP solution to a version that includes these upgraded dependencies (at least ABP 8.2+, and in practice you should move to the latest ABP version in your major line).

If you’re staying on ABP 10.1.1 specifically, there is no verified ABP source stating that ABP 10.1.x supports System.IdentityModel.Tokens.Jwt 8.x via its own packages. The verified ABP guidance available shows the framework moving to 7.5.1 (not 8.x) as part of its dependency upgrades.

Links (verified):

  • https://abp.io/docs/latest/release-info/migration-guides/abp-8-2#upgraded-nuget-dependencies

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.

Answer
  • Don’t edit _content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/.../font-bundle.css (it comes from the NuGet package and will be regenerated/overwritten).
  • Instead, override the theme’s font-bundle.css with your own file (same virtual path) so the @import url("https://fonts.googleapis.com/...") line is never shipped to the browser.

Step-by-step

  1. Create a local replacement file in your Blazor WASM client project:

MyProjectBlazorClient/wwwroot/_content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/side-menu/css/font-bundle.css

Put your local @font-face declarations there (pointing to your local .woff2/.woff files under wwwroot/fonts/inter/...) and do not include any @import to Google Fonts.

Example skeleton (adjust paths to your real files):

/* MyProjectBlazorClient/wwwroot/_content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/side-menu/css/font-bundle.css */

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/fonts/inter/Inter-VariableFont.woff2") format("woff2");
}

/* add italic, opsz variants as needed... */
  1. (Optional but recommended) Also override RTL if your app uses RTL:

MyProjectBlazorClient/wwwroot/_content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/side-menu/css/font-bundle.rtl.css

(Usually it can be identical to font-bundle.css.)

  1. Rebuild and redeploy. The browser will still request font-bundle.css, but it will now be served from your app and will not contain the Google Fonts import, so no request to fonts.googleapis.com will be triggered.

This works because ABP serves static files from your app’s wwwroot, and a file placed under the exact same _content/{packageId}/... path effectively overrides the packaged static resource at runtime.


Sources (verified)

  • https://abp.io/docs/latest/framework/ui/mvc-razor-pages/bundling-minification#bundle-contributors
  • https://abp.io/docs/latest/release-info/migration-guides/abp-7-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, the built-in Google reCAPTCHA integration is provided for Login (and, depending on the UI/module, Register) but the Account module’s /Account/ForgotPassword UI does not include a reCAPTCHA challenge by default. That’s why you can toggle it for login/registration but don’t see an option for the forgotten password page.
  • To protect the forgot-password endpoint from being abused to send大量 reset emails, implement one (or both) of the following ABP-aligned mitigations:
  1. Add CAPTCHA to the Forgot Password UI (recommended)
  • Create your own Razor Page for /Account/ForgotPassword (same way you customize Login/Register pages in ABP: copy the page into your host project under Pages/Account so it overrides the module page).
  • In that custom ForgotPassword.cshtml, render your CAPTCHA widget (Google reCAPTCHA or any other).
  • In ForgotPassword.cshtml.cs, validate the CAPTCHA before calling the underlying password reset flow. If CAPTCHA fails, return the page with an error message and do not send the email.
  1. Add server-side throttling to stop email flooding (also recommended)
  • Even with CAPTCHA, you should rate-limit the forgot-password action (per IP, per email, per tenant) to prevent abuse and to protect your SMTP provider.
  • In ABP, the password reset email is sent from the Account application service. You can override the method that sends password reset links/codes and add throttling/guards there.
    • ABP support guidance shows overriding SendPasswordResetCodeAsync on AccountAppService via service replacement:
[Dependency(ReplaceServices = true)]
  [ExposeServices(typeof(IAccountAppService))]
  public class MyAccountAppService : AccountAppService
  {
      public MyAccountAppService(/* same ctor deps as base */) : base(/* ... */)
      {
      }

      public override async Task SendPasswordResetCodeAsync(SendPasswordResetCodeDto input)
      {
          // 1) Rate limit / throttle here (per IP/email/etc.)
          // 2) Optionally perform extra checks
          // 3) Then call base or replicate base logic
          await base.SendPasswordResetCodeAsync(input);
      }
  }

Add your throttling logic before calling base.SendPasswordResetCodeAsync(input).

If you implement (1), you stop most automated attacks at the UI level. If you implement (2), you protect the system even if attackers bypass the UI and call the endpoint directly.

Links:

  • https://abp.io/docs/latest/modules/account
  • https://abp.io/support/questions/4488
  • https://abp.io/support/questions/489

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.

  • If your DateTime value coming from the database is UTC (which is the typical/recommended setup when AbpClockOptions.Kind = DateTimeKind.Utc), then to get it in the configured timezone (app/tenant/user via Abp.Timing.TimeZone, e.g. EST), call:
var estTime = Clock.ConvertToUserTime(utcDateTime);

Example (entity loaded from DB):

var entity = await _repo.GetAsync(id);

// entity.SomeTime is assumed UTC
var estTime = Clock.ConvertToUserTime(entity.SomeTime);

Notes (important):

  • ConvertToUserTime(DateTime dateTime) only converts if:
    • multi-timezone support is enabled (i.e., AbpClockOptions.Kind = DateTimeKind.Utc so IClock.SupportsMultipleTimezone == true), and
    • dateTime.Kind is Utc.
  • The returned DateTime will have Kind = Unspecified (as shown in ABP’s examples), because it represents “user/local” time without embedding timezone in DateTime.

If you are using DateTimeOffset properties, you can also use:

var estTimeOffset = Clock.ConvertToUserTime(dateTimeOffset);

Sources:

  • https://abp.io/docs/latest/framework/infrastructure/timing
  • https://abp.io/community/articles/zk7fnrdq

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, AbpClockOptions only lets you choose the kind (Utc, Local, Unspecified). It does not support setting IClock to an arbitrary timezone like “EST”, so Clock.Now cannot be made to directly return “EST time”.
  • The recommended approach is:
    1. Keep AbpClockOptions.Kind = DateTimeKind.Utc (store/process in UTC).
    2. Use ABP’s timezone feature to convert UTC to the user/tenant/application timezone when you need to display or work with “local” times.

What to do instead (EST example):

  1. Enable UTC clock (as you already do):
Configure<AbpClockOptions>(options =>
   {
       options.Kind = DateTimeKind.Utc;
   });
  1. Set the timezone via the ABP setting Abp.Timing.TimeZone (user/tenant/app level). Then:
    • Use Clock.ConvertToUserTime(utcDateTime) to get the time in the configured timezone.
    • Use Clock.ConvertToUtc(userDateTime) when taking user input and persisting.

So your code should typically look like:

var utcNow = Clock.Now; // UTC (when Kind = Utc)
var estNowForUser = Clock.ConvertToUserTime(utcNow); // converted using Abp.Timing.TimeZone

Links:

  • https://abp.io/docs/latest/framework/infrastructure/timing
  • https://abp.io/community/articles/zk7fnrdq

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.

  • With TenantUserSharingStrategy.Shared in ABP 10.2, the login flow is host-first (global identity is established before a tenant context is selected). As a result, tenant-specific runtime OIDC challenge configuration (Authority/ClientId/ClientSecret per tenant) is not compatible with the Shared strategy’s core flow, because the system doesn’t know the tenant at the moment it must choose the external IdP to challenge.
  • In ABP, per-tenant external login configuration is supported when the tenant context is known (classic multi-tenancy flow). The Account.Pro “External Logins” system is explicitly described as multi-tenant compatible and allows each tenant to configure/override provider settings. However, that model assumes the tenant can be resolved before initiating the challenge.
  • Therefore, for your scenarios:
    1. Per-tenant Entra ID credentials: cannot be deterministically selected at the start of authentication under Shared (tenant unknown).
    2. Mixed authentication methods across tenants: Shared makes authentication rules global-first; tenant-specific “must use SSO / must forbid password” cannot be enforced at the initial sign-in step in the standard Shared flow.
    3. Per-tenant security policies: in Shared, those are host-level by design (ABP documentation also states security settings are managed at Host level).

What you can do (verified ABP-supported approaches):

  1. Use TenantUserSharingStrategy.Isolated if you require per-tenant IdP selection at sign-in

    • This is the only fully consistent approach if each tenant brings its own Entra/Okta config and the tenant must be resolved before challenge.
    • You still can provide a good UX with tenant resolution (subdomain, tenant name, email domain mapping, etc.), but it won’t be “global-auth first”.
  2. Keep Shared, but restrict yourself to “global external IdP(s)” (host-level)

    • If you can use a single Entra multi-tenant app registration (or a single federation entry point) for all customers, Shared works well because the host can always challenge the same provider.
    • Tenants can still differ in authorization/roles/permissions after tenant selection, but not in initial IdP selection.
  3. If you need tenant-specific allowed login methods (not tenant-specific OIDC credentials), customize external provider availability per tenant

    • ABP support guidance shows you can replace ExternalProviderSettingsHelper to filter which external providers are available per tenant (e.g., TenantA sees “windows,google”, TenantB sees “google”). This can help with “mixed authentication methods across tenants” only after tenant context exists (e.g., on tenant-specific login pages or flows that resolve tenant early).
    • This is done by replacing the service (example shown in ABP support answer), and using ICurrentTenant to decide which providers to return.
  4. Hybrid flow (tenant selection before authentication) is not provided as a built-in mode for Shared in ABP 10.2

    • Your “Option A” (email → resolve tenants → select tenant → challenge correct IdP) is conceptually valid, but there is no verified built-in ABP 10.2 feature that changes Shared’s host-first external challenge to tenant-first selection.
    • Implementing that would require a custom login UX + custom authentication flow, and you’d effectively be reintroducing “tenant known before auth” for external login—at which point Isolated is usually the simpler/cleaner solution.

Sources (validated)

  • https://abp.io/docs/10.2/modules/account/shared-user-accounts
  • https://abp.io/docs/latest/modules/account-pro
  • https://abp.io/support/questions/6637
  • https://abp.io/support/questions/8731

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.

Please contact us at https://abp.io/contact to request a reset of your activated developer machines and to resolve the ABP-LIC-0012 activation issue.


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.

  • Remove your explicit DataSeeder.SeedAsync(...) call from CreateAsync.
    In ABP, tenant creation already triggers seeding via the tenant-created flow (you’re also publishing TenantCreatedEto, and your system has an event handler that seeds). Calling DataSeeder.SeedAsync in the same method guarantees a duplicate seed run and will cause slowness + “already exists” type errors.

    So change your method to:

[Authorize(TenantManagementPermissions.Tenants.Create)]
  public virtual async Task<TenantDto> CreateAsync(TenantCreateDto input)
  {
      var tenant = await TenantManager.CreateAsync(input.Name);
      input.MapExtraPropertiesTo(tenant);

      await TenantRepository.InsertAsync(tenant);
      await CurrentUnitOfWork.SaveChangesAsync();

      await DistributedEventBus.PublishAsync(
          new TenantCreatedEto
          {
              Id = tenant.Id,
              Name = tenant.Name,
              Properties =
              {
                  { "AdminEmail", input.AdminEmailAddress },
                  { "AdminPassword", input.AdminPassword }
              }
          });

      return ObjectMapper.Map<Tenant, TenantDto>(tenant);
  }
  • Put all tenant-initialization logic into the event handler (single place).
    The event handler should:

    1. switch tenant (using (CurrentTenant.Change(...)))
    2. run migrations if you do separate DB per tenant
    3. call DataSeeder.SeedAsync(new DataSeedContext(tenantId).WithProperty(...))

    This ensures it runs exactly once and can be executed reliably even if tenant creation happens from another service/process.

  • If you want it synchronous (not recommended), then don’t publish TenantCreatedEto.
    That would stop the handler from running, but you lose the standard “tenant created” integration behavior. The recommended ABP approach is the opposite: keep the event, remove the manual seeding.

Links (validated):

  • https://abp.io/docs/latest/framework/infrastructure/data-seeding
  • https://abp.io/docs/latest/framework/architecture/multi-tenancy#change-the-current-tenant

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.

  • This error means the API (resource server) is validating the JWT and rejects it because the iss (issuer) claim inside the access token does not match what the API expects from the discovery document / configured authority.
  • In ABP (OpenIddict AuthServer), the issuer is derived from the incoming HTTP request unless you explicitly set it. When you put the AuthServer behind Cloudflare Zero Trust / reverse proxy, the AuthServer may “see” a different scheme/host than the public one, causing tokens to be issued with an unexpected iss.

Fix (recommended): Force a stable Issuer on the AuthServer

In your AuthServer project, set the issuer to your public URL (the one you want clients/APIs to accept):

using OpenIddict.Server;

public override void PreConfigureServices(ServiceConfigurationContext context)
{
    var configuration = context.Services.GetConfiguration();

    PreConfigure<OpenIddictServerBuilder>(builder =>
    {
        builder.SetIssuer(new Uri(configuration["AuthServer:Authority"]!));
        // Example value should be exactly the public issuer:
        // https://auth-apollo-stg.ligjamaica.com/
    });
}

Then make sure AuthServer:Authority is exactly the same value everywhere (AuthServer, API/HttpApiHost, Blazor app), including scheme (https) and trailing slash behavior (be consistent; OpenIddict typically returns issuer with a trailing /).

Fix (also important behind Cloudflare): Ensure forwarded headers are honored

Because Cloudflare terminates TLS, your container may receive HTTP internally. Configure forwarded headers early in the pipeline (AuthServer and the API hosts) so ASP.NET Core can reconstruct the original scheme/host:

using Microsoft.AspNetCore.HttpOverrides;

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

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

    // ... the rest of your middleware pipeline
}

This helps OpenIddict generate correct endpoints/issuer when it relies on the current request.

What to verify after changes

  1. Open the discovery document publicly:
    • https://auth-apollo-stg.ligjamaica.com/.well-known/openid-configuration Confirm issuer is exactly:
    • https://auth-apollo-stg.ligjamaica.com/
  2. Acquire a new access token and confirm its iss claim matches the same value.
  3. Ensure the API’s AuthServer:Authority points to that same URL.

Sources:

  • https://abp.io/community/articles/4u3wrbs5
  • https://abp.io/support/questions/4338
  • https://abp.io/docs/latest/modules/openiddict

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 391 to 400 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.