To resolve the 400 response code for logout after upgrading to ABP 9.1.1, you need to ensure that the exact post_logout_redirect_uri (including port) used in the logout request is registered in your OpenIddict application's configuration.
In ABP 9.x (and recent OpenIddict versions), the post_logout_redirect_uri must match exactly (including scheme, host, and port) with one of the URIs registered for the client application. Registering only http://127.0.0.1 is not sufficient if your application uses random ports (e.g., http://127.0.0.1:31270/).
Solution:
How to Register Multiple Redirect URIs:
OpenIddictDataSeedContributor.cs
), add each allowed post logout redirect URI:builder.WithPostLogoutRedirectUris(
"http://127.0.0.1:31270/",
"http://127.0.0.1:31271/",
// Add all ports your app may use
);
References:
This strict matching is a security requirement in recent OpenIddict versions and is enforced by ABP 9.x. Adjust your client registration or application logic accordingly to resolve the 400 error.
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 is a known behavior in ABP Framework. When you set "Abp.Account.IsSelfRegistrationEnabled" in the AuthServer's appsettings.json, it only sets the default value for the setting. The UI on the settings page (host/tenant → Account tab) displays the value from the AbpSettings table, not the default from appsettings.json. If there is no record in the AbpSettings table, the UI will show the default (which is "true" unless overridden in the database), even if the actual behavior is "false" due to your appsettings.json.
Once you toggle and save the setting in the UI, a record is created in the AbpSettings table, and the UI will then reflect the correct value.
Workaround / Solution:
Why this happens:
ABP's setting system uses the following precedence:
The UI only reads from the database, not from appsettings.json, unless a record is created.
References:
This is the expected design in ABP Framework. If you want the UI to always reflect the appsettings.json value, you would need to customize the settings management UI to also read from configuration, which is not the default behavior.
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.
示例配置(以 API 服务为例):
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://localhost:44301/";
options.Audience = "MyProjectName";
});
微服务调用时自动传递 token:
[DependsOn(
typeof(AbpHttpClientIdentityModelModule)
)]
public class MyModule : AbpModule
{
// ...
}
详细排查步骤:
官方文档与案例:
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.
To customize all background colors in the LeptonX Dark and Dim themes, you should override the relevant SCSS variables defined in the theme's color map files. Here’s how you can do it:
src/styles/_colors/dark/colors.scss
(for Dark)src/styles/_colors/dim/colors.scss
(for Dim)content-bg
(main content area)navbar-active-bg-color
, navbar-color
(top bar)card-bg
(cards and panels)container-active-text
, content-text
(text color on backgrounds)card-bg,
content-bg,
navbar-active-bg-color,
navbar-color,
...
custom-leptonx-overrides.scss
) and import it after the default LeptonX theme styles in your global styles.// For Dark theme
[data-theme="dark"] {
--lpx-content-bg: #2d1e12 !important; // Example brown
--lpx-navbar-color: #3a2415 !important;
--lpx-card-bg: #3a2415 !important;
}
// For Dim theme
[data-theme="dim"] {
--lpx-content-bg: #3b2a1a !important;
--lpx-navbar-color: #4a3320 !important;
--lpx-card-bg: #4a3320 !important;
}
styles.scss
or reference in angular.json
after the default LeptonX styles).[data-theme="dark"]
and [data-theme="dim"]
selectors, your overrides will apply globally whenever those themes are active.Summary of Steps:
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.
To ensure your custom code is preserved and correctly generated in ABP Suite's templates, you must use the special custom code block placeholders provided by ABP Suite. When customizing templates like Frontend.Mvc.Page.CreateModal.cshtml.txt
or Frontend.Mvc.Page.EditModal.cshtml.txt
, any code you want to persist and regenerate must be placed between these placeholders:
<!--<suite-custom-code-block-0>-->
<!--</suite-custom-code-block-0>-->
For example, to add a <div>
before the <abp-modal>
tag and ensure it is not lost during code generation, wrap your custom code like this:
<!--<suite-custom-code-block-0>-->
<div>Your custom content here</div>
<!--</suite-custom-code-block-0>-->
<abp-modal id="...">
...
</abp-modal>
ABP Suite will preserve and move any code inside these blocks during regeneration. If you add custom code outside of these placeholders, it may be ignored or overwritten by the generator, especially after the property section or template variables.
For more details, see the official documentation below.
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.
The error ABP-LIC-0016 - You are not granted permission to use the module 'Volo.CmsKit.Pro.Common.HttpApi-v9.3.1.0'
means your current ABP license does not include access to the CMS Kit Pro module.
The ABP Business license does not grant permission for all commercial modules. Specifically, CMS Kit Pro is only available for certain license tiers (typically Enterprise). Attempting to use a module not covered by your license will result in this error and prevent the application from running.
How to resolve:
Volo.CmsKit.Pro
and related Pro modules from your solution. Use only the open-source CMS Kit modules if you do not have the required license.Steps:
Volo.CmsKit.Pro.*
.Reference:
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.
To completely disable self-registration in ABP Framework (v9), including removing the registration link from your custom login page and disabling the registration API endpoint (api/account/register
), follow these steps:
Disable Self-Registration in Settings:
/SettingManagement
).false
. This will hide the registration link on the login page and prevent users from registering themselves via the UI.Remove or Hide Registration Link in Custom Login Page:
@if (await SettingProvider.IsTrueAsync(AccountSettingNames.IsSelfRegistrationEnabled))
{
// Do NOT render the registration link if self-registration is disabled
}
api/account/register
endpoint, override or remove the related service in your application module. You can do this by replacing the AccountController
or the Register
method with your own implementation that returns a 404 or 403, or by removing the endpoint entirely if you have the source code.[Authorize("Never")]
public override Task<IdentityUserDto> RegisterAsync(RegisterDto input)
{
throw new AbpAuthorizationException("Self registration is disabled.");
}
Note: Disabling self-registration in settings only hides the UI and disables the API logic, but the endpoint may still be visible in Swagger unless you override or remove it as described.
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.
When the ABP Angular frontend cannot reach the backend, it cannot load the backend localization resources. In this scenario, the Angular app falls back to the default value specified in the code, which is "MyProjectName" for the AppName
key. This is why you see "MyProjectName" as the browser tab title when the backend is offline, regardless of your index.html
or manual overrides.
To override this fallback and ensure your desired title ("pro") is always used even when the backend is unavailable, you should provide a frontend-only localization resource for the AppName
key in your Angular app. This way, the Angular localization system will use your value instead of the default.
How to fix:
app.module.ts
, add a frontend localization entry for AppName
:import { provideAbpCore, withOptions } from '@abp/ng.core';
@NgModule({
providers: [
provideAbpCore(
withOptions({
localizations: [
{
culture: 'en',
resources: [
{
resourceName: 'pro', // Use your resource name
texts: {
"AppName": "pro"
}
}
]
}
]
}),
),
],
})
export class AppModule {}
Make sure the resourceName
matches the one used in your backend (e.g., "pro").
This ensures that even if the backend is unreachable, the Angular app will use "pro" for the AppName
key.
Reference:
This approach is the recommended way to provide fallback localization values for frontend-only scenarios in ABP Angular.
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.
To hide the "Idle Session Timeout" tab from the Settings page for all users (host and tenant) in an ABP Angular application, you need to remove or hide the related setting from the UI. The ABP Framework does not provide a direct configuration to hide individual settings tabs out-of-the-box, so you must customize the Angular UI.
The recommended approach is to override or customize the Angular settings component to exclude the "Idle Session Timeout" tab. Here are the general steps:
src/app/proxy/account/settings
or similar).If you want to ensure the setting is not available at the backend level as well, you can also override the related setting definition in your application layer to set isVisibleToClients: false
for the idle session timeout setting. This will prevent it from being sent to the client.
Example (in your module's SettingDefinitionProvider
):
context.Add(
new SettingDefinition(
AccountSettingNames.IdleSessionTimeout,
defaultValue: "60",
isVisibleToClients: false // Hide from all clients
)
);
After making these changes, rebuild and redeploy your application. The "Idle Session Timeout" tab should no longer appear in the settings UI for any user.
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.
The detailed audit log change tracking (showing both old and new values for each property) that you see on the official ABP demo website is available in the latest ABP Commercial versions. According to the footer in your screenshot, the official demo is running on ABP v9.2.3.
Your project is using v8.3.0, which does not include the enhanced audit log UI and API features for displaying property-level change details in the same way as v9.x. These improvements were introduced in later versions after v8.3.0.
To get the same audit log detail experience as the official website, you need to upgrade your solution to at least ABP v9.2.3.
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.