Configure<AbpClockOptions>(options => options.Kind = DateTimeKind.Utc); only enables ABP’s UTC clock / multi-timezone behavior. It does not automatically add a “TimeZone dropdown” to your React UI.DateTime values to UTC when writing/returning (you’ll typically see ISO-8601 with Z, e.g. 2025-03-01T10:30:00Z).IClock.ConvertToUserTime(...) / IClock.ConvertToUtc(...).ABP uses the Abp.Timing.TimeZone setting. If it’s not set, ABP can detect the browser time zone during initialization and store it in the request (cookie/header) and then use it for conversions (middleware-based behavior is described in the multi-timezone article).
So:
Configure<AbpClockOptions>(options =>
{
options.Kind = DateTimeKind.Utc;
});
2025-03-01T10:30:00Z, display it by converting to the user’s locale/time zone (ABP JS APIs exist for this in supported UIs; conceptually the article shows using abp.clock.normalizeToLocaleString(...) for display).2025-03-01 10:30 in their local time zone, you must convert to a UTC ISO string before sending, otherwise the backend will store “as-is” and you’ll see offsets/issues. The article demonstrates doing this using ABP JS helpers (e.g., abp.clock.normalizeToString(...) / datepicker helpers).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 ABP Volo.Abp.AdminConsole 10.4.x–10.6.x (including 10.6.0), the Admin Console React UI renders “Back to the application” as a client-side router link to /. Since the Admin Console router is mounted with basepath = /admin-console, that navigation resolves to /admin-console, not to your separate React SPA. In other words: in these versions there is no built-in “return URL” concept for that link in the shipped Admin Console bundle.
The Admin Console runtime configuration endpoint (/admin-console/api/config) (as documented) exposes Admin Console options like enabling/disabling, redirecting / to /admin-console, authority/client id/scope, theme, localization, etc., but it does not document (or provide) an application.returnUrl that the built-in UI could use for this link. So there is nothing you can configure today (in 10.6.0) to make that link point back to your separate React app.
Practical, supportable workaround (backend-side) that avoids patching minified JS:
/ is not the Admin Console entry point:
AdminConsole:RedirectRootToAdminConsole to false (or the equivalent AbpAdminConsoleOptions.RedirectRootToAdminConsole = false)./ (or a dedicated endpoint like /return-to-app) performs an HTTP redirect to your SPA root (e.g. /app) — using your own controller/middleware.
/admin-console (or to / under certain conditions), you can control what / does and make it “go back to the application”.If you want the behavior you described (“application.returnUrl from runtime config + render as <a href=...>”), that matches the documented pattern in the “Non React UI Integration” document, but Admin Console does not currently implement that pattern in the shipped package versions you tested.
Sources:
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.
What you’re seeing is consistent with the Admin Console React SPA being built for a fixed /admin-console base path. Under UsePathBase("/sub/backend") (or IIS virtual application), the server can still serve /sub/backend/admin-console/*, but the client-side router (TanStack Router) and several root-absolute asset/API URLs inside the compiled bundle still assume the app is mounted at the site root, so the SPA matches no routes and shows its own “404 Page not found”.
In ABP 10.6, the Admin Console hosting model is documented as being served under a fixed path:
/admin-console/*/admin-console/api/*
This aligns with your observation that the compiled SPA hardcodes /admin-console and does not automatically incorporate Request.PathBase.Practical resolution (supported approach today): run Admin Console at a host root OR provide it an origin that has no PathBase.
PathBase) orhttps://example.org/admin-console (root app) instead of https://example.org/sub/backend/admin-console/sub/backend, then the only reliable workaround on 10.6.x is essentially what you already implemented: rewrite the served HTML/JS/CSS/config responses to inject the effective base path (because the SPA is shipped as embedded static resources and is not path-base aware).There is no consumer-side configuration in AbpAdminConsoleOptions that can fix the SPA router base/chunk base/font URLs when the bundle itself is compiled with root-absolute /admin-console... paths. Options like Authority / ThemeOverrideCssPath can only patch a subset of the problems you listed.
If you want this fixed upstream, the core requirement is: Admin Console SPA build needs to derive its base at runtime (e.g., from document.baseURI / injected <base href> / a config endpoint) and avoid root-absolute URLs in emitted CSS and dynamic imports. As you noted, simply serving it under a PathBase is not enough if the bundle is compiled with a fixed base.
Links (validated):
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.
No connection could be made because the target machine actively refused it (127.0.0.1:5672)UnableToConnect on 127.0.0.1:6379Updating packages may have fixed your build, but it won’t fix these two services being unreachable.
This error means nothing is accepting TCP connections on 127.0.0.1:5672. Even if the Windows service shows “Running”, the broker may not actually be listening (or it’s bound differently / blocked).
Fix options (pick one):
ElsaDemoApp.Server RabbitMQ configuration to match the actual host/port you have.In ElsaDemoApp.Server appsettings (the one actually used at runtime), verify the RabbitMQ endpoint is correct, e.g.:
"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "localhost",
"Port": "5672"
}
}
}
Your log shows ABP is using Redis for distributed cache at 127.0.0.1:6379, and that connection is failing. You must either:
A) Start Redis on localhost:6379 (recommended for the demo), or
B) Change the Redis connection string to wherever your Redis actually is, or
C) Disable Redis for local run (only if the sample supports that in its configuration; otherwise you’ll keep hitting caching initialization failures).
Given your exception comes from ABP’s feature/permission static savers hitting distributed cache, running Redis is the simplest path.
I can’t access /QA/Files/Download/... from here, so I can’t verify the exact package versions you updated. But again: your current crash is clearly from RabbitMQ + Redis connectivity, not package resolution.
If you want the quickest “known-good” environment to run ElsaDemoApp:
localhost:5672 and localhost:6379.(sources)
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.
ElsaDemoApp.Server:
127.0.0.1:5672127.0.0.1:6379ElsaDemoApp.Server configuration points to the correct host/port and credentials.In ElsaDemoApp.Server/appsettings.json (or the environment-specific variant), ensure you have a correct RabbitMQ section similar to:
"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "localhost",
"Port": "5672"
}
}
}
If your RabbitMQ uses non-default credentials, also set UserName / Password (ABP reads RabbitMQ connection settings from configuration).
Your startup fails later because ABP is trying to use Redis distributed cache at 127.0.0.1:6379:
If Redis is enabled in config, verify something like this in appsettings.json:
"Redis": {
"IsEnabled": "true",
"Configuration": "127.0.0.1:6379"
}
Make it consistent with your actual Redis endpoint. If you don’t have Redis, set IsEnabled to false or remove the Redis configuration section used by the solution.
For samples like ElsaDemoApp, upgrading packages arbitrarily can introduce version mismatches. Prefer keeping package versions aligned with the sample’s original ABP version (you mentioned ABP 10.6.0). If you already upgraded, revert to the original versions shipped with the sample (or align all ABP packages to the same version).
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.
ReplaceableComponentsService + LeptonX component keys (eThemeLeptonXComponents.*). You register your replacement at app startup, and LeptonX renders your component in that slot.// e.g. app.component.ts (or an app initializer)
import { ReplaceableComponentsService } from '@abp/ng.core';
import { eThemeLeptonXComponents } from '@volosoft/abp.ng.theme.lepton-x'; // LeptonX (commercial)
import { MyToolbarContainerComponent } from './my-toolbar-container.component';
constructor(replaceable: ReplaceableComponentsService) {
replaceable.add({
key: eThemeLeptonXComponents.Toolbar, // slot key
component: MyToolbarContainerComponent, // your implementation
});
}
For replacing the overall application layout (what you described as “currently rendered via abp-dynamic-layout”): ABP’s supported way is to replace the layout component (still using component replacement). Practically, your root template can stay as <abp-dynamic-layout />, while you replace the layout slot used by LeptonX to render the shell. (This keeps ABP’s route integration intact because routing is still driven by Angular router + ABP packages; the layout is just a host.)
For “extract features from lpx-settings (theme + language)” and move them into your toolbar replacement:
@abp/ng.core (commonly SessionStateService for language selection + ConfigStateService for reading available languages). This is the same pattern used in ABP Angular UI custom header examples (language list comes from config state, selected culture from session state).lpx-settings (so relying on undocumented internals is not upgrade-safe).For replacing lpx-navbar while keeping “active route detection, collapse state, grouped/child menu items, permission-based visibility”:
*abpPermission="...") and menu data is provided by ABP’s Angular packages; LeptonX’s navbar is ultimately a renderer over that data. (Public docs do not provide a “supported internal navbar service contract” for LeptonX itself; so the supported approach is replace the UI and consume ABP Angular’s menu/permission APIs rather than LeptonX internals.)For toolbar user info + login/logout/profile actions + custom entries:
UserMenuService to remove/patch/add items (this is used in official support guidance; the key point is to apply changes after currentUser becomes authenticated, because the menu can be (re)built around login/tenant changes).AuthService / navigation helpers as needed).Source access / sample:
abp get-source Volo.Abp.LeptonXTheme), but the verified/official support answer we can cite is: ABP Suite download source code.lpx-toolbar-containerReplaceableComponentsService + the relevant eThemeLeptonXComponents.* key (toolbar slot).lpx-settings and into your toolbarlpx-settings as stable contracts.lpx-navbarReplaceableComponentsService, and render menu items using ABP Angular menu + permission primitives (rather than depending on LeptonX internal navbar services).abp-dynamic-layout host)<abp-dynamic-layout /> at the root so ABP keeps routing/layout resolution.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 mcp-studio bridge so MCP clients (Cursor / Claude Desktop / VS Code) can connect and use ABP Studio’s tools/context.If your goal is to request an official ABP Docs MCP server (like the shadcn example), that’s a product/feature request. Please contact the ABP team here:
(For reference on ABP’s current MCP offering in ABP Studio:)
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.
GET /news list page (fetch blog posts)GET /news/:slug detail pageGlobalFeatureConfigurator), then create migrations and update the DB in that service.Use the official “add module to microservice” guide for the gateway/routes/migrations/connection-string mapping aspects (this is the definitive integration doc for microservices).
Yes for the public-facing pages (news list/detail) in your React app.
ABP’s React direction is “source-owned UI” (your pages live in your React app), while administration is handled by the pre-built React Admin Console. There isn’t an official “CMS Kit provides ready React public pages/widgets you can reuse” story in the verified sources.
If your requirement is “draft/publish news articles + store content + management UI”, CMS Kit / CMS Kit Pro is the intended ABP module for that. You’ll just implement the React pages that display the content.
Sources (validated)
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.
PermissionGrantResult.Prohibited, and if any provider returns Prohibited, the final result is always prohibited (even if user/role providers granted it). This matches your “never grant, only subtract” requirement.PermissionValueProvider (or IPermissionValueProvider) and register it in AbpPermissionOptions.ValueProviders. In that provider, read:
context.Principal (claim AbpClaimTypes.UserId)(UserId, PermissionName, Channel) and return Prohibited when there is a block rule; otherwise return Undefined so normal ABP granting continues.Example skeleton:
using System;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Security.Claims;
public class ChannelBlockPermissionValueProvider : PermissionValueProvider
{
public const string ProviderName = "ChannelBlock";
public override string Name => ProviderName;
public ChannelBlockPermissionValueProvider(IPermissionStore permissionStore)
: base(permissionStore)
{
}
public override async Task<PermissionGrantResult> CheckAsync(PermissionValueCheckContext context)
{
var userIdString = context.Principal?.FindFirst(AbpClaimTypes.UserId)?.Value;
if (!Guid.TryParse(userIdString, out var userId))
{
return PermissionGrantResult.Undefined;
}
// Example: determine channel from a claim/header you add to the principal
var channel = context.Principal?.FindFirst("channel")?.Value; // "Mobile" / "Api"
if (string.IsNullOrWhiteSpace(channel))
{
return PermissionGrantResult.Undefined;
}
// TODO: query your table: (userId, context.Permission.Name, channel) => IsBlocked
var isBlocked = await /* your store */ Task.FromResult(false);
return isBlocked
? PermissionGrantResult.Prohibited // subtractive deny
: PermissionGrantResult.Undefined; // let role/user grants decide
}
}
Register it:
Configure<AbpPermissionOptions>(options =>
{
options.ValueProviders.Add<ChannelBlockPermissionValueProvider>();
});
PermissionGrant): ABP’s built-in PermissionGrant storage is designed around provider-based grant state; your scenario is a contextual deny (user+permission+channel), so the supported way is not to try to encode this into PermissionGrant, but to use a custom permission value provider and your own persistence. (ABP’s provider pipeline already supports the deny outcome via PermissionGrantResult.Prohibited.)/api/abp/application-configuration):
grantedPolicies map for the current principal.Prohibited results.X-Channel: Mobile + middleware/claims transformation that adds channel claim to the principal before permission evaluation). Then the normal ABP permission evaluation used by application configuration will naturally produce the channel-specific result.Prohibited semantics). The channel-specific rule storage and how you detect “channel” is expected to be implemented in application/module code.Links (validated):
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.
No — ABP 10.1.1 targets Angular 21 (its Angular UI packages/templates are aligned with Angular 21), so Angular 22 is not supported/compatible for ABP 10.1.1.
If you want to use Angular 22, you should upgrade ABP to a version that upgraded its Angular UI stack to Angular 22 (ABP 10.6).
https://abp.io/docs/10.4/release-info/migration-guides/abp-10-1
https://abp.io/docs/10.6/release-info/migration-guides/abp-10-6-angular-22
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.