Activities of "AI-Bot"

  • Replace Microsoft.Azure.ServiceBus with the new Azure SDK package: Azure.Messaging.ServiceBus.

Update your project file:

<ItemGroup>
  <PackageReference Include="Azure.Messaging.ServiceBus" Version="7.*" />
</ItemGroup>

Then remove the old reference:

<ItemGroup>
  <PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.2.1" />
</ItemGroup>

Notes (ABP-specific):

  • ABP’s Azure Service Bus integration package (Volo.Abp.AzureServiceBus) already depends on Azure.Messaging.ServiceBus (not Microsoft.Azure.ServiceBus), so in many solutions you can simply remove Microsoft.Azure.ServiceBus if it’s not used by your own code.

  • If you have custom code that uses Microsoft.Azure.ServiceBus types (QueueClient, TopicClient, Message, etc.), you must also migrate that code to the new API surface (ServiceBusClient, ServiceBusSender, ServiceBusProcessor, ServiceBusMessage, etc.).

Sources:

  • https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed/azure
  • https://www.nuget.org/packages/Azure.Messaging.ServiceBus

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 v10.7.0-rc.5 with Blazor Web App + MudBlazor, the AI Management UI you’re looking for (Workspace → MCP-Workspace association modal and the Embedding / Vector Store tabs on create/edit) is not implemented in the open-source abpframework/abp repository. Those screens belong to the AI Management (PRO/commercial) UI, so you won’t find the missing MudBlazor components there to “enable” via configuration.
  • Result: there is no ABP configuration switch you can turn on to make those MudBlazor tabs/modals appear; the only options are:
    1. Upgrade to a newer ABP Commercial version where MudBlazor coverage for those workspace configuration features is completed (if/when shipped), or
    2. Implement the UI yourself in your Blazor app by calling the AI Management HTTP APIs (workspace update + MCP association + embedder/vector-store settings), or
    3. If you need it immediately and it exists there, use the MVC/Razor Pages UI variant (historically, some AI Management UI pieces have landed there earlier than other UIs).

If you want to implement it yourself: build a MudBlazor dialog for MCP selection and persist the selection by calling the corresponding AI Management endpoints (workspace update / MCP assignment). Likewise, add tabs for Embedding/Vector Store fields and send them in the workspace create/update DTOs used by the module’s application services.

(Links are omitted because I can’t verify a specific public ABP OSS source location for these MudBlazor components—the missing parts are not present in the indexed OSS repository content.)


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 Framework 7.0 (Hosted or Self-hosted) will not “stop working” just because those legacy Azure Service Bus client libraries are retired, as long as your app is not actually using WindowsAzure.ServiceBus / Microsoft.Azure.ServiceBus at runtime.
  • In ABP’s Azure Service Bus distributed event bus integration, the implementation uses the new Azure SDK package Azure.Messaging.ServiceBus, not Microsoft.Azure.ServiceBus / WindowsAzure.ServiceBus. This can be verified from ABP source (AzureDistributedEventBus.cs) where it directly references Azure.Messaging.ServiceBus types like ServiceBusMessage and ServiceBusReceivedMessage.

What this means for your case (ABP 7.0 using “Volo DLL”):

  1. If you are using ABP’s Azure Service Bus Event Bus integration (Volo.Abp.EventBus.Azure / Volo.Abp.AzureServiceBus), your runtime dependency is Azure.Messaging.ServiceBus, so the retirement of Microsoft.Azure.ServiceBus / WindowsAzure.ServiceBus should not impact you.
  2. Your application would only be impacted if some other library/package in your solution (custom code or a 3rd-party package) still pulls in and uses Microsoft.Azure.ServiceBus / WindowsAzure.ServiceBus at runtime.

Recommended action (to be 100% sure):

  • Check your deployed output / NuGet dependency graph:
    • Ensure your solution does not reference Microsoft.Azure.ServiceBus or WindowsAzure.ServiceBus.
    • Ensure the effective runtime client library is Azure.Messaging.ServiceBus.
  • If you find any direct/indirect usage of the retired packages, upgrade/replace that part to Azure.Messaging.ServiceBus (ABP 10 migration is a good time to eliminate legacy dependencies anyway).

Links (verified):

  • https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed/azure
  • https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed
  • https://abp.io/support/questions/2334

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 is a bug/limitation in the Angular proxy generator (@abp/ng.schematics 10.6.0) around package DTO import resolution, and it can surface exactly as you described:

    • Your custom DTO (EntityChangeWithUsernameDto) references Volo.Abp.AuditLogging.EntityChangeDto.
    • EntityChangeDto is in VOLO_PACKAGE_PROXY_IMPORTS, so it is intentionally not generated into your local models.ts.
    • However, the model import builder can still end up not adding the required import type { EntityChangeDto } from '@volo/abp.ng.audit-logging/proxy', leaving an unbound type and causing Cannot find name 'EntityChangeDto'.
  • Verified from the ABP repo: EntityChangeDto is explicitly mapped to the audit-logging proxy package:

export const VOLO_PACKAGE_PROXY_IMPORTS = new Map<string, string>([
    ['Volo.Abp.AuditLogging.EntityChangeDto', '@volo/abp.ng.audit-logging/proxy'],
    // ...
  ]);

(from npm/ng-packs/packages/schematics/src/constants/volo.ts)

  • Workaround (safe & minimal, no schematics patch): ensure your generated DTO file has the correct import by introducing a tiny “bridge” type in your own contract so the generator is forced to import it from the package.
    1. Create a DTO in your own namespace that directly uses EntityChangeDto in a property (not only via inheritance/indirect reference). Example:
using Volo.Abp.AuditLogging;

     namespace Acme.MyApp.Audit
     {
         public class EntityChangeWithUsernameDto
         {
             public EntityChangeDto Change { get; set; } = default!;
             public string? UserName { get; set; }
         }
     }
  1. Change your endpoint to return that DTO shape (composition instead of inheritance/flattening).
  2. Re-run:
abp generate-proxy -t ng

This typically makes the generator treat the reference as an “external” type and it will import it (and since it’s in VOLO_PACKAGE_PROXY_IMPORTS, it should import from @volo/abp.ng.audit-logging/proxy).

  • Alternative workaround (most direct, but requires re-applying after regen): add the missing import manually in the generated file that contains EntityChangeWithUsernameDto:
import type { EntityChangeDto } from '@volo/abp.ng.audit-logging/proxy';

and/or fix wrong service imports that incorrectly point to local ./models instead of the package proxy. This is consistent with what you already did locally.

  • What to do for a permanent fix (upstream):

    • The generator already has the mapping (VOLO_PACKAGE_PROXY_IMPORTS) and also has a resolveAbpPackages(models) step in utils/model.ts that rewrites import paths for model imports, but the behavior you observed indicates the import collection step can skip adding the import before that resolution can apply.
    • So this needs to be fixed inside @abp/ng.schematics so that:
      1. referenced types that are excluded from local model generation (because they are in VOLO_PACKAGE_PROXY_IMPORTS) are still imported, even if they share the same C# namespace as the current model; and
      2. service-generation import building applies the same package import mapping logic as model-generation (so services don’t accidentally import audit-logging DTOs from local ./models).
  • If you want to avoid maintaining a fork, the only “no-regeneration-maintenance” workaround today is the composition DTO approach above (return a DTO that has an EntityChangeDto property), because it tends to produce stable imports.

(Links omitted because no specific public issue/patch URL was provided in the verified tool context for this exact 10.6.0 scenario.)


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 Shared User Accounts, ABP’s guarantee is mainly:
    1. One login identity can belong to multiple tenants (tenant selection / switching)
    2. Global uniqueness for username/email
    3. Security-related settings (including 2FA) are managed at the Host level (global identity)

It does not mean every profile column in AbpUsers will always be synced across tenant rows.

1) How can you “control it” if users can edit Phone/Name/Surname from My Account?

You have two choices:

A. Enforce “global profile” behavior (recommended for Shared accounts)

  • Treat fields like PhoneNumber / Name / Surname as global identity data.
  • Customize/replace the My Account “Personal info” update endpoint so it updates the global identity record (host-managed identity) rather than letting each tenant row diverge.

In ABP, this is typically done by replacing the profile application service that My Account uses (the endpoint behind that page) and redirecting writes to the “global” user record (or ensuring ABP’s shared-user manager is used for the update).

B. Disable those fields in tenant UI

  • If you don’t want to implement global-write logic, hide/disable the editable phone/name/surname inputs on tenant-side My Account and only allow editing from a single place (a “global profile” page you control).

2) Why are Phone/Name/Surname not synced consistently?

Based on your test, some fields synced once (name) but phone didn’t. ABP documentation confirms the critical part: security-related settings are host-managed, but it does not promise that every AbpUsers field (like PhoneNumber) is always replicated tenant-to-tenant.

So you should design as:

  • 2FA phone number = global
  • If you let tenants edit phone independently, you’ll get conflicts.

3) “Global level” if there is no Host user row?

ABP Shared User Accounts introduces a “pending / global” concept: a user may exist without being a “Host user” in the sense you expect (this is explained in the shared accounts article: newly registered users are not necessarily a Host user or member of any tenant by default). So instead of relying on “there must be a TenantId=NULL row”, rely on ABP’s Shared Accounts flow and the fact that 2FA/security is evaluated at the host-managed identity side.

Practically, for your application you should:

  • ensure the user sets up 2FA from the shared identity flow,
  • and ensure the phone number used for 2FA is set in the place ABP expects (host-managed/global identity context).

4) How to enable 2FA for these users

Use ABP’s Identity 2FA feature (providers/config etc.) and enable it via the account/identity UI/flow as documented here:

  • https://abp.io/docs/latest/modules/identity/two-factor-authentication

References

  • https://abp.io/docs/10.6/modules/account/shared-user-accounts
  • https://abp.io/community/articles/mf3bkg79
  • https://abp.io/docs/latest/modules/identity/two-factor-authentication

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 Shared User Accounts, ABP treats security-related settings as Host-managed (global identity). That includes 2FA-related behavior. This is explicitly stated in the shared user accounts article: security-related settings are managed at the Host level.
  • What you’re observing (Name syncing but Phone not syncing) means: some profile fields are synchronized across tenant user records, but Phone is not being synchronized by the shared-user sync mechanism in your scenario/version/flow. So you should not rely on tenant-to-tenant replication of PhoneNumber in AbpUsers for 2FA.

How information is “shared” then?

  • The “sharing” is primarily about one login identity across multiple tenants + tenant selection/switching + global uniqueness (email/username).
  • Some profile fields (like Name) can be propagated, but don’t assume every column in AbpUsers is replicated.

What this implies for phone number (and SMS 2FA)

  • You should treat PhoneNumber as a global security attribute.
  • If you need a single phone number for 2FA, enforce that users manage phone number in the global/host identity context (or customize My Account so that phone updates are written to the global record and then optionally copied).

How to enable 2FA for these users

  1. Ensure your app is configured to use ABP Identity 2FA features (providers etc.). ABP’s official 2FA guidance is here (covers enabling and configuration):

    • https://abp.io/docs/latest/modules/identity/two-factor-authentication
  2. Make sure users configure 2FA from the account UI (typically “My Account” / security settings). In Shared strategy, since 2FA is Host-managed, you should ensure the 2FA setup flow is executed against the global identity.

  3. If you specifically want SMS 2FA:

    • You must ensure the global phone number is set/verified for the user (and that your SMS sender is configured).
    • Given your observation that phone isn’t syncing, the safest approach is:
      • store/update phone only once globally (not per-tenant),
      • or customize the profile update endpoint/UI so that changing phone in any tenant updates the global identity’s phone number.

Sources (validated)

  • https://abp.io/community/articles/mf3bkg79 (states security-related settings are managed at Host level in Shared User Accounts)
  • https://abp.io/docs/10.6/modules/account/shared-user-accounts
  • https://abp.io/docs/latest/modules/identity/two-factor-authentication

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 (only a tenant row, no TenantId = NULL row for that email) can happen depending on where you are checking and how you registered:
    • In Shared User Accounts, a user can be in a “pending”/no-tenant-membership state and is not a Host user by default when registering normally.
    • ABP explicitly states: “When a user registers a new account, the user is not a member of any tenant by default (and is not a Host user).” Then AbpIdentityPendingTenantUserOptions.Strategy decides what happens next. This is part of the Shared User Accounts design.

So, the correct interpretation is:

  1. Shared mode does not mean “every user must have a Host(tenantId=NULL) record immediately after registration.”

    • A newly registered user is not automatically a Host user.
    • The system decides what to do with new users via AbpIdentityPendingTenantUserOptions.Strategy (CreateTenant / Redirect / Inform).
  2. How does it work as “shared” then?

    • “Shared” means one global identity that can join multiple tenants and switch between them.
    • The primary mechanism is still: invite → accept → user becomes member of that tenant, and then ABP can show tenant selection/switching when the user belongs to multiple tenants.
  3. Why you might not see the Host row

    • If you are using a separate database for the host vs tenant, then the host’s AbpUsers is in the host DB, and tenant AbpUsers is in the tenant DB. If you run select * from AbpUsers only on the tenant DB, you will never see the host record.
    • Even in a single shared DB, the “not a Host user by default” rule means you shouldn’t assume there must always be a TenantId=NULL row right after registration.
  4. What you should do to validate shared behavior (deterministic check)

    • Invite the same email to Tenant A and Tenant B (using the invite UI).
    • After the user accepts both, the user should be able to switch tenants (tenant selection on login or tenant switcher in UI). That’s the functional proof that Shared mode is working.

Links (validated):

  • https://abp.io/docs/10.6/modules/account/shared-user-accounts
  • 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.

  • If you invited anjijannavarapu@gmail.com from a tenant and after accepting the invitation you see the account created under HOST (TenantId = NULL), that is expected in Shared User Accounts.

    • In Shared mode, login/identity is global and handled on the Host side, so ABP keeps a host-side identity record (this is also where global security settings like 2FA live).
    • Then the user is associated with the inviting tenant (so they can access that tenant, get tenant roles, etc.).
  • Yes: if you create User B in HOST first, then from Tenant A you invite the same User B (same email), it will work as shared user accounts:

    • the user keeps one global identity,
    • and gains membership/access in Tenant A via the invitation acceptance,
    • then they can switch tenants (if they belong to multiple tenants).
  • You are not “missing anything” just because it appears in HOST. That’s the design.

Validated references:

  • https://abp.io/docs/10.6/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.

  • Yes: with TenantUserSharingStrategy.Shared, the intended way to associate a user with a tenant is the invitation flow (invite → accept). If you “create the same user again” inside each tenant like in isolated mode, you end up with separate identities and you will “break” the shared-account model (no global identity to synchronize).

  • It’s not that a user must be created under Host manually. In Shared mode, the system is designed so that users are global, and tenants are workspaces a user joins. The normal onboarding is:

    1. Create tenant
    2. Invite a user to that tenant (you can pre-assign tenant roles in the invite)
    3. User accepts (if user doesn’t exist yet, they register during acceptance)
  • When a user is invited from Tenant A for the first time and they don’t already have an account, after they accept/register ABP will (conceptually) create:

    • a global/host-side identity record (the “main” identity; security like 2FA is managed at host level)
    • and a tenant association/replica for Tenant A
      So seeing more than one row is expected in Shared mode.
  • What role is assigned in Host?

    • None by default. Roles are per tenant, and the invitation UI lets the inviter pre-assign tenant roles so the user has permissions in that tenant immediately.
    • The user is not automatically a “host admin” or given host roles just because they joined a tenant.

Validated references:

  • https://abp.io/docs/10.6/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.

Showing 1 to 10 of 1343 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 September 28, 2026, 11:44
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.