Activities of "AI-Bot"

  • This is a known limitation of ABP Suite’s navigation-property discovery in modular solutions: Suite primarily detects “existing entities” (like IdentityUser) from the main solution’s module/package graph and the standard layered projects, but it doesn’t reliably surface entities coming only from a referenced ABP module package inside a separate custom module in the way you expect.

  • Workaround (supported by Suite): add the navigation property manually instead of relying on the dropdown list.

    1. In ABP Suite, open your entity → Navigation Properties → Add Navigation Property.
    2. In the “Existing Entity” selector, if IdentityUser doesn’t appear, use the manual entry approach described in the Suite docs (“Alternatively, you can add IdentityUser … by manually entering the required information”).
    3. Provide the required information for:
      • Target entity type (e.g., Volo.Abp.Identity.IdentityUser)
      • FK property (e.g., IdentityUserId / UserId as Guid)
      • Display property and DTO info as needed by Suite’s generation logic.
  • After generation, if you hit EF Core mapping errors when relating to module entities (commonly around ExtraProperties), ensure your module’s DbContext model configuration includes the module mappings before configuring your own entities (e.g., the relevant builder.ConfigureIdentity() / builder.ConfigureIdentityPro() calls depending on what you use). This is a separate runtime concern from Suite’s UI not listing the entity, but it’s a common follow-up when adding relations to IdentityUser.

  • If you need Suite to list those module entities in the UI for custom modules specifically: there is no verified configuration switch/documented setting that enables that behavior today; the practical approach is the manual navigation-property entry.

Links (verified):

  • https://abp.io/docs/latest/suite/generating-crud-page
  • https://abp.io/community/articles/furp75ex

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.

  • Yes, you can use the Text Template Management module even if you keep using AutoMapper in your own code. In ABP 10, ABP modules (including Text Template Management) were migrated to Mapperly, but that doesn’t prevent your solution from also using AutoMapper for your DTO/entity mappings.
  • What you cannot do in practice is “not use Mapperly at all” in an ABP 10 solution if you want to use ABP modules that were migrated. Those module assemblies are built against ABP’s Mapperly integration and will use it internally. You don’t need to write Mapperly mappers for Text Template Management just to use it—but Mapperly will still be present/used by the module under the hood.

So the supported setup is:

  1. Keep AutoMapper (licensed) for your own mappings (profiles, CreateMap, etc.).
  2. Let ABP modules use Mapperly internally (Text Template Management, etc.).
  3. Avoid removing Mapperly packages/dependencies from the solution if ABP modules require them.

If you want your own application layer to keep mapping via AutoMapper, register AutoMapper in your modules as you did in ABP 9; ABP’s object mapping abstraction is designed to allow different mapping providers by module/app.

(verified)

  • https://abp.io/docs/10.0/release-info/migration-guides/AutoMapper-To-Mapperly
  • https://abp.io/docs/latest/framework/infrastructure/object-to-object-mapping#advanced-topics

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.

  • Yes. In ABP 10.x you can continue using AutoMapper in your own application/modules if you purchase/hold a valid AutoMapper commercial license.
  • ABP 10 migrated ABP modules/templates to Mapperly, so modules like Text Template Management use Mapperly internally by default, but ABP still provides both AutoMapper and Mapperly integrations and they can co-exist in the same solution.
  • Practical implications:
    • You can keep your existing AutoMapper Profiles and registrations for your code.
    • ABP module code will still use Mapperly where it was migrated.
    • If you use context-based registration like AddAutoMapperObjectMapper<TModule>(), make sure consumers map with the same ObjectMapperContext to avoid “No object mapping was found…” errors in some layers (e.g., Blazor).

Links:

  • https://abp.io/docs/10.0/release-info/migration-guides/abp-10-0
  • https://abp.io/docs/latest/release-info/migration-guides/AutoMapper-To-Mapperly
  • https://abp.io/docs/latest/framework/infrastructure/object-to-object-mapping#advanced-topics

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, “switch tenant” in the UI is just changing the current tenant context for the frontend, and then ensuring every API call includes the tenant information.
  • For a custom frontend (Next.js) you implement the same idea by:
    1. getting the available tenants for the logged-in user (for Shared User Accounts),
    2. letting the user pick one,
    3. persisting the selection (cookie/localStorage/session),
    4. sending the tenant to the backend on every request as the __tenant header (or query string when needed).

1) Persist “current tenant” in your Next.js app

Pick one storage mechanism:

  • Cookie (recommended; works for SSR and API routes)
  • LocalStorage (only client-side)

Example (cookie):

  • Store abp_tenant = tenant name (or id, depending on your backend usage; ABP commonly resolves by name in UI switchers).

2) Send the tenant on every API request (__tenant header)

ABP Angular UI does this: it reads the selected tenant and sends it as __tenant header on each request.

In Next.js, do the same in your API client wrapper:

// apiClient.ts
export async function abpFetch(input: RequestInfo, init: RequestInit = {}) {
  const headers = new Headers(init.headers);

  // Read from cookie (client-side example)
  const tenant = document.cookie
    .split("; ")
    .find(x => x.startsWith("abp_tenant="))
    ?.split("=")[1];

  if (tenant) {
    headers.set("__tenant", decodeURIComponent(tenant));
  }

  return fetch(input, { ...init, headers });
}

If you also do SSR, read the cookie from the incoming request in getServerSideProps / route handlers and forward __tenant.

3) Create a “tenant switcher” UI

  • Call an endpoint to list tenants the current user can switch to (Shared User Accounts feature provides this capability via the Account/Identity Pro modules).
  • When the user selects a tenant:
    1. write cookie abp_tenant=<tenantName>
    2. reload the app (so SSR + cached config reflect new tenant)
    3. subsequent API calls include __tenant

4) After switching: refresh “application configuration” and auth context

In ABP UIs, the selected tenant also affects application-configuration (and what menus/features are visible). In your Next.js app, after setting the tenant cookie/header:

  • re-fetch your “bootstrap” data (profile, permissions, menus, etc.) under the new tenant context.
  • if you cache tokens/claims client-side, note that ABP re-issues auth context when switching in its own UI. In a custom UI, the safest approach is: reload and re-fetch user/permission-related data after tenant change.

5) Login/redirect flows (important)

If your login is done via the ABP Auth Server pages, tenant selection can be involved in the login UX. In custom SPAs, it’s common to:

  • let user login first,
  • then show “select tenant” if multiple tenants are available,
  • then set __tenant for API calls.

(If you must pass tenant during auth redirects, ABP UIs pass tenant via request parameters/headers depending on flow; the key concept remains: tenant context must be resolved on the server side.)


References (validated)

  • https://abp.io/docs/latest/modules/account/shared-user-accounts
  • https://abp.io/docs/latest/framework/ui/angular/multi-tenancy
  • https://abp.io/community/articles/mf3bkg79

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.


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 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.

  • Volo.Abp.OperationRateLimiting.Domain-v10.3.0.0 is a commercial (Pro) module. In ABP v10.3, your app is trying to load/use this module (often indirectly via Account Pro modules / template defaults), but your current ABP license/token doesn’t grant access to it, so the runtime blocks it with:
    You are not granted permission to use the module 'Volo.Abp.OperationRateLimiting.Domain-v10.3.0.0'.

  • Fix options (pick one):

    1. Use a license that includes Operation Rate Limiting (it requires ABP Team or higher) and ensure your app has a valid AbpLicenseCode (or the correct ABP license setup for your environment).
    2. Remove/stop referencing the module: find and remove any DependsOn(...) that pulls in OperationRateLimiting (directly or via a Pro module you don’t have rights for), and remove the related NuGet packages from your solution.
    3. If this started right after upgrade and you believe you should have access: your ABP CLI/login token may be expired. Re-login and rebuild/run:
abp login <username> -p <password>
 (This is especially common in Docker/CI or new machines where the token isn’t present.)
  • Practical “where to look”:
    • Check your *.HttpApiHostModule / *.WebModule / *.BlazorModule DependsOn(...) chain for modules that could bring it in (Account Pro, etc.).
    • Check *.csproj for Volo.Abp.OperationRateLimiting.* packages (or Pro packages that depend on it).

Links (verified):

  • https://abp.io/docs/latest/modules/operation-rate-limiting
  • https://abp.io/pricing
  • https://abp.io/support/questions/791

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, username/email must be globally unique (Host + all tenants). So having two different users with the same UserName = admin is not expected in a correctly working Shared User Accounts setup.
  • The symptom you see during login (“only the first tenant’s admin works; the other returns Invalid username or password”) is consistent with this: the login flow (host-side) resolves a user by username/email, finds the first matching “admin”, then password verification is performed for that user. If the password you typed belongs to the other “admin” record, it fails and you get “Invalid username or password”.

What to do (verified, definitive)

  1. Do not seed/create “admin” separately per tenant when using Shared strategy.

    • In Shared mode, the recommended flow is:
      1. Create tenant
      2. Invite an existing global user (or let them register from invitation)
      3. Assign roles in that tenant
    • If you created tenants in a way that auto-creates a tenant-local admin user (classic isolated behavior), you can end up with conflicting global identities.
  2. Fix your current data

    • In the Host database, ensure there is only one AbpUsers record for a given UserName (and also uniqueness across emails).
    • Then associate that single global user with multiple tenants via the Shared User Accounts invitation/association mechanism (rather than having separate “admin” users).
  3. Re-test using invitations

    • Create a single global user (e.g., admin) once.
    • Invite that user into tenant A and tenant B.
    • On login, ABP should authenticate once and then (if user belongs to multiple tenants) show a tenant selection step.

Conclusion

This behavior is not expected under Shared User Accounts; it indicates your tenants were created/seeded in a way that produced duplicate global identities (two different host users with the same username). The correct approach is one user globally + tenant associations, not “one admin per tenant”.

  • https://abp.io/docs/latest/modules/account/shared-user-accounts
  • https://abp.io/community/articles/mf3bkg79

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 ABP Angular Core options are not registered in the injector, so RestService can’t be created: RestService -> InjectionToken CORE_OPTIONS.

  • In ABP Angular, CORE_OPTIONS is provided by ABP Core initialization (and for Basic theme layouts also by the theme config providers). When you navigate to the Angular-side login (AccountLayoutComponent from the theme), your app must already have these providers registered in the root application config/module.

1) Ensure ABP Core is initialized (registers CORE_OPTIONS)

In your Angular root bootstrap (Standalone style: app.config.ts, Module style: AppModule), make sure ABP Core is configured with the environment.

Standalone (ABP v10 / Angular 21 typical): src/app/app.config.ts

import { ApplicationConfig } from '@angular/core';
import { provideAbpCore } from '@abp/ng.core';
import { environment } from '../environments/environment';

export const appConfig: ApplicationConfig = {
  providers: [
    provideAbpCore({
      environment,
    }),
  ],
};

Module-based (if your app still uses NgModules): app.module.ts

import { CoreModule } from '@abp/ng.core';
import { environment } from '../environments/environment';

@NgModule({
  imports: [
    CoreModule.forRoot({
      environment,
    }),
  ],
})
export class AppModule {}

2) If you are using Basic Theme layouts for account/login, register Basic theme config

Since you said you use Basic Theme source code and want “Angular side login”, you must also provide the Basic theme configuration (this registers the layouts like AccountLayoutComponent correctly).

src/app/app.config.ts:

import { provideThemeBasicConfig } from '@abp/ng.theme.basic';

export const appConfig: ApplicationConfig = {
  providers: [
    // ...provideAbpCore(...)
    provideThemeBasicConfig(),
  ],
};

3) If the error started after upgrading / Studio workspace changes: fix TS path mappings

A known cause is tsconfig.json / workspace paths overriding ABP package resolution so the app ends up loading mismatched ABP packages and misses the provider.

Add these mappings to the tsconfig.json used by your Angular app (not a library tsconfig):

{
  "compilerOptions": {
    "paths": {
      "@abp/*": ["node_modules/@abp/*"],
      "@volo/*": ["node_modules/@volo/*"]
    }
  }
}

Then clean reinstall:

rm -rf node_modules package-lock.json yarn.lock
yarn   # or npm install
yarn start

Sources (validated):

  • https://abp.io/docs/10.2/framework/ui/angular/basic-theme
  • https://abp.io/support/questions/10506

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

1. Solution

This error means your public website is hitting an API endpoint that expects id as a Guid, but it is receiving a slug like "home":

  • Request: GET https://localhost:44362/home
  • Validation error: The value 'home' is not valid. (id)
  • So the route that is being executed is effectively something like .../{id} where id is Guid.

That’s why all CMS pages fail: the “catch-all route” that should map /{slug} to the CMS Kit public page renderer is not being used anymore (routing order / endpoint mapping / fallback configuration changed after upgrade or custom routing/middleware).

Apply these fixes (they are safe and deterministic):

  1. Ensure the CMS Kit Public Website module is actually included in the Public Web project In your Public Website host module, you must depend on the CMS Kit Public Web module (or the commercial equivalent if you’re using Pro). Example pattern:
[DependsOn(
    // ...
    typeof(Volo.CmsKit.Public.Web.CmsKitPublicWebModule)
)]
public class YourPublicWebModule : AbpModule
{
}

If this dependency is missing, ABP won’t register the Razor Pages/routes that handle /{slug}.

  1. Make sure the Public Website is not mapping a “{id} as Guid” route at root Search your Public Web project for conventional routes like:
  • pattern: "{id}" or "{controller}/{action}/{id:guid?}" mapped at root
  • Minimal API routes like app.MapGet("/{id}", ...) where id is bound to Guid
  • Any MapFallbackToPage(...) / fallback endpoint that forwards everything to an endpoint that binds id as Guid

Remove/adjust those routes so they don’t steal /{slug}.

  1. If you added global authorization, remove it for the Public Website Your symptom “redirect to AuthServer” typically happens when the Public Website has a global authorization policy like FallbackPolicy = DefaultPolicy / RequireAuthenticatedUser().

Make sure you did not configure a global “require authenticated user” policy for the Public Website app. If you did, remove it (public CMS pages must be anonymously accessible).

  1. Rebuild & restart both Public Web and HttpApi Host After fixing routing/module dependency/policies, restart. Then test:
  • GET /home should return HTML (page content)
  • GET /api/cms-kit-public/pages/home should return 200/204 (depending on existence), not a redirect/challenge

If you did any module/feature changes, also run DbMigrator (you already do, but do it once after these changes).

2. Sources

  • https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Index
  • https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Pages

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 281 to 290 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.