Please contact us at https://abp.io/contact so the team can help you complete the purchase and add the additional developer license (they can also check why the card transaction is failing on the payment side).
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.
AbpPermissionGrants being “wrong”.grantedPolicies until the client refreshes/reloads its cached application configuration.Do this to fix your scenario (RBAC not reflected after you remove permissions):
Force the Angular client to re-load application configuration after login/logout and after permission changes
ApplicationConfigurationDto in memory across sessions (SPA can do this)./api/abp/application-configuration) for the affected user to refresh grantedPolicies.Verify you are not accidentally checking an empty/incorrect permission key in Angular
''/null due to a bug, many UI checks will behave unexpectedly and may look like “everything is granted”.*abpPermission, PermissionService.getGrantedPolicy(...), etc.Double-check tenant context when reading grants
AbpPermissionGrants is tenant-scoped. If you check grants with the wrong TenantId or wrong provider key/name, you can think it “doesn’t exist” while it actually exists for another tenant/provider.Confirm it’s not granted via another provider
If you implement #1 (refresh/re-fetch application configuration) your “removed permissions still come back in open configuration response” symptom should stop, because the frontend will stop using the stale grantedPolicies.
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.
With ABP’s built-in Azure Service Bus distributed event bus provider, a single host application can be configured with only one TopicName and one SubscriberName via Azure:EventBus (that config maps to one topic + one subscription for that app). There is no supported appsettings.json format to declare multiple topics/subscriptions for the same host using the default provider.
If you must use one host app and still consume from 3 topic/subscription pairs, you have only these viable options:
Recommended ABP way: use 1 topic, 1 subscription, and let ABP route by event type
MyApp).MyHost).If you strictly need 3 different topics: do it outside ABP EventBus
Azure.Messaging.ServiceBus) and create your own ServiceBusProcessor instances (one per topic/subscription) inside your host app.Azure:EventBus format”; it’s custom code.Because option (2) requires custom code and ABP has no official “multiple topics per app” configuration for the Azure EventBus provider, the direct answer to “how to do it in the same host app via appsettings” is: you can’t with the default ABP Azure EventBus configuration.
Link (validated): https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed/azure
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’s Azure Service Bus distributed event bus integration, the Azure:EventBus section represents a single topic + a single subscription name per application:
TopicName = the topic ABP publishes to / listens fromSubscriberName = the subscription name created/used under that topic for this applicationBecause of that, you can’t configure 3 topics + 3 subscriptions in the same Azure:EventBus section in appsettings.json in the “existing format”. ABP reads one TopicName and one SubscriberName.
What you should do instead:
MyApp.SubscriberName per microservice/app (each consumer app uses a different subscription under the same topic).Azure:EventBus configs (one per topic) or implement a custom event bus provider/routing (not supported via appsettings in the default provider).Example (recommended): single topic, 3 subscriptions (3 apps)
appsettings.json for ServiceA:{
"Azure": {
"ServiceBus": {
"Connections": {
"Default": {
"ConnectionString": "Endpoint=sb://sb-my-app.servicebus.windows.net/;SharedAccessKeyName=...;SharedAccessKey=..."
}
}
},
"EventBus": {
"ConnectionName": "Default",
"TopicName": "MyApp",
"SubscriberName": "ServiceA"
}
}
}
appsettings.json for ServiceB:{
"Azure": {
"ServiceBus": {
"Connections": {
"Default": {
"ConnectionString": "Endpoint=sb://sb-my-app.servicebus.windows.net/;SharedAccessKeyName=...;SharedAccessKey=..."
}
}
},
"EventBus": {
"ConnectionName": "Default",
"TopicName": "MyApp",
"SubscriberName": "ServiceB"
}
}
}
appsettings.json for ServiceC:{
"Azure": {
"ServiceBus": {
"Connections": {
"Default": {
"ConnectionString": "Endpoint=sb://sb-my-app.servicebus.windows.net/;SharedAccessKeyName=...;SharedAccessKey=..."
}
}
},
"EventBus": {
"ConnectionName": "Default",
"TopicName": "MyApp",
"SubscriberName": "ServiceC"
}
}
}
If you put EntityPath=... in the connection string: for topics/subscriptions, ABP already uses TopicName, so keep the connection string at the namespace level (no EntityPath) unless you have a specific reason.
Link (verified): https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed/azure
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.aspnetcore.mvc.ui.theme.leptonx (MVC UI) does not ship Dropzone. In current LeptonX MVC packages, the file-upload component/library used by the theme is Uppy, so seeing uppy installed is expected behavior.wwwroot/libs/... (or in LeptonX’s bundled assets) unless your solution explicitly adds Dropzone.If you specifically need Dropzone in an ABP MVC app:
wwwroot (e.g., via your frontend build, LibMan, or by copying from node_modules into wwwroot/libs).Links (verified):
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 are seeing is expected with ABP’s default background job executor in a scaled-out (multiple instance) environment: each instance runs its own background job worker, so if the storage/provider doesn’t guarantee distributed “pick and lock”, you can end up with duplicate executions.
Best practice options (recommended order):
Use a real distributed background job provider (Hangfire)
Run background job execution in a separate “job executor” application (single instance)
Configure<AbpBackgroundJobOptions>(options =>
{
options.IsJobExecutionEnabled = false;
});
- Then create a separate console app that references your job types and runs the background job module/provider.
EmailNotificationId / CorrelationId) and enforce “send only once” in your own tables (unique index + “already sent” check).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.
In ABP, /api/abp/application-configuration returns auth.grantedPolicies for the current user. A permission can be true there even if there is no row in AbpPermissionGrants.
true without a matching row:
true without needing a DB record.AbpPermissionGrants is tenant-scoped. If you check the table without matching TenantId (and correct ProviderName/ProviderKey), you can miss the record that actually caused the grant.Fix it in a definitive way (server + Angular):
PermissionAppService.GetAsync(providerName, providerKey) (Permission Management Module) which returns details including “granted providers” (useful for diagnosing why it’s true).AbpPermissionGrants, filter by the correct TenantId (and correct ProviderName/ProviderKey).IsGranted = false row (a prohibition). That guarantees the permission resolves to false even if it might otherwise be granted./api/abp/application-configuration.Angular button show/hide best practice:
PermissionService.getGrantedPolicy(...) (or getGrantedPolicy$) and ensure you are checking the exact permission name.true in ABP Angular permission selectors, which can make it look like “everything is true” if the key you pass is accidentally empty.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.
In a separate Public Web (MVC/Razor) + separate AuthServer (OpenIddict) setup, the Public Web must be an OpenID Connect client and use its own local cookie for the signed-in session. If the OIDC client/cookie setup is missing or misconfigured, the login UI can appear to work (credentials accepted on AuthServer) but no auth cookie is created in the Public Web, so ICurrentUser.IsAuthenticated stays false.
Do this in Public Web (its *.Web project/module), ensuring:
HttpContext.User/ICurrentUser in the Public Web app).https://localhost:44387/signin-oidc) and is registered in OpenIddict client.userinfo unless you really need it (otherwise you can get “login succeeds but no user is established” symptoms depending on token/claims settings).Put/adjust in your Public Web module (e.g. PublicWebModule / YourProjectWebModule) ConfigureServices:
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
// Optional but recommended in multi-app scenarios:
options.Cookie.Name = ".YourCompany.PublicWeb.Auth";
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Authority = configuration["AuthServer:Authority"]; // https://localhost:44349
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
options.ClientId = configuration["AuthServer:ClientId"]; // the PublicWeb client id in OpenIddict
options.ClientSecret = configuration["AuthServer:ClientSecret"]; // if applicable
options.ResponseType = OpenIdConnectResponseType.Code;
options.UsePkce = true;
options.SaveTokens = true;
// IMPORTANT (often fixes “login ok but not authenticated” issues due to userinfo problems)
options.GetClaimsFromUserInfoEndpoint = false;
options.Scope.Clear();
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Scope.Add("roles");
});
}
In the AuthServer’s OpenIddict client registration (seed/config), ensure the Public Web client has:
redirect_uri: https://localhost:44387/signin-oidcpost_logout_redirect_uri: https://localhost:44387/signout-callback-oidcauthorization_codeopenid profile email roles (+ any API scopes you need)ICurrentUser is emptyICurrentUser is populated from the current HTTP request user principal. In an MVC app that comes from the local authentication cookie. If the Public Web app doesn’t issue/receive its own cookie after the OIDC callback, HttpContext.User stays anonymous → ICurrentUser stays empty.
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.
AbpUsers, AbpRoles, AbpUserRoles) rather than an ABP “CreateAsync bug”.Volo.Abp.Identity.IdentityUserController.CreateAsync, then EF Core executes a batch that updates role concurrency stamps + inserts into AbpUserRoles, but SQL Server can’t finish within the default 30s (because it’s blocked or the DB is overloaded). In Azure this can happen with DTU/CPU pressure, long-running transactions, or stuck pods/instances holding locks.While reproducing the issue (try creating a user), run this on the same SQL database used by the Identity service:
-- Who is blocked / blocking right now?
SELECT
r.session_id,
r.status,
r.command,
r.blocking_session_id,
r.wait_type,
r.wait_time,
r.wait_resource,
t.text AS sql_text
FROM sys.dm_exec_requests r
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id > 50;
What to look for:
blocking_session_id <> 0wait_type like LCK_M_*AbpUsers / AbpRoles / AbpUserRolesIf you see a suspended session coming from one of your app instances/pods (common in tiered + distributed setups), the practical fix is:
This doesn’t fix blocking, but it prevents failing at exactly 30 seconds while you diagnose:
In the module where you configure EF Core (your Identity/HttpApiHost EF Core module), configure SQL Server command timeout:
using Microsoft.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpDbContextOptions>(options =>
{
options.UseSqlServer(sqlOptions =>
{
sqlOptions.CommandTimeout(120); // seconds
});
});
}
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.
It’s not expected for an Angular UI solution to be created without an angular folder.
In ABP solution templates, when you select UI: Angular, the generated solution should include an angular directory at the root (this is where the Angular client-side app lives). If it’s missing after creating the solution in ABP Studio, it usually means the UI part was not generated/downloaded successfully during creation (e.g., a failed/blocked “install/generate frontend” step).
What you can do (safe steps that don’t change your backend structure):
abp new ... -u angular) and compare outputs; the Angular folder should be there in the CLI-generated structure too.If ABP Studio consistently creates the backend but skips Angular generation, it’s a Studio-side issue/regression after the upgrade.
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.