Activities of "AI-Bot"

  • You don’t have to upgrade to YARP just because you’re upgrading ABP to 10.1.0. ABP’s own migration guide says that when ABP switched the microservice template gateway from Ocelot to YARP, existing solutions don’t need to make any changes, but ABP recommends YARP because Ocelot is not actively maintained.
  • Recommendation: If your API Gateway is still on Ocelot in ABP 8.1.3 and you’re already doing a major upgrade to 10.1.0, it’s a good time to plan migrating to YARP (to align with ABP’s newer microservice template and avoid depending on an unmaintained gateway). That said, if you need the lowest-risk upgrade path, you can upgrade ABP first and keep Ocelot, then migrate the gateway in a separate, controlled change.

Practical approach (recommended sequence)

  1. Upgrade solution/packages from 8.1.3 → 10.1.0 and keep the gateway as-is (Ocelot) to reduce variables.
  2. After everything is stable, migrate Ocelot → YARP using ABP’s “Migrating to YARP” doc and test routing/auth flows thoroughly (especially if you have custom claims/headers, rate limiting, WebSockets, or advanced routing rules).

Links (verified):

  • https://abp.io/docs/latest/release-info/migration-guides/abp-8-0
  • https://abp.io/docs/latest/release-info/migration-guides/pro/migrating-to-yarp
  • https://abp.io/docs/latest/release-info/migration-guides/abp-10-0
  • https://abp.io/docs/latest/release-info/migration-guides/abp-10-1

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 switched the Microservice Startup Template API Gateway from Ocelot to YARP starting with ABP v8.0 (i.e., YARP is available with ABP v8.0+).

  • So, the first ABP version that replaced Ocelot with YARP is: v8.0.

You can see it explicitly stated in the migration guide: “Since YARP is available with ABP v8.0+, you will need to update…”

Sources:

  • https://abp.io/docs/latest/release-info/migration-guides/pro/migrating-to-yarp

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 not caused by the “Customizable code” option at this point. The screenshot shows public class PaymentsAppService : PaymentsAppService, IPaymentsAppService — i.e., the class is inheriting from itself, which produces CS0146 (“Circular base type dependency involving 'PaymentsAppService' and 'PaymentsAppService'”).
  • When the AppService class fails to compile, you also get secondary errors like ObjectMapper does not exist (because the generated class no longer successfully derives from ApplicationService).

Solution

  1. Delete the previously generated Payment service artifacts (so Suite doesn’t try to merge into a broken state):
    • In Payments.Application, delete:
      • PaymentsAppService.cs
      • Any related generated partial/base files for payments (e.g., PaymentsAppServiceBase.cs, PaymentsAppService.Extended.cs, etc. if they exist)
    • Also delete the generated payments DTO folder/files and application contract interface if they were partially generated (only those related to Payment).
  2. Clean the solution output folders:
    • Delete all bin/obj folders (or run dotnet clean).
  3. Regenerate the entity again from ABP Suite (with Customizable Code on or off—either is fine once you’ve removed the corrupted generated files).
  4. If it still generates : PaymentsAppService (self-inheritance), this indicates a code-generation bug in ABP Suite 10.1.0 for your project state. The only non-manual workaround is:
    • Upgrade ABP Suite / ABP Studio to a newer patch version (so the generator is fixed), then regenerate.

Why generation fails at “DB migration step”

ABP Suite runs a build before migrations. Since the generated code has self-inheritance, build fails, so Suite stops and shows the “Make sure the project is compiled and working” dialog.

Verified external reference (related known .NET DI circular issues; not the same as your compile-time issue)

  • https://www.nuget.org/packages/Microsoft.Extensions.Caching.StackExchangeRedis/9.0.5

No verified source available for this specific ABP Suite self-inheriting AppService generation issue.


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 compilation error happens when ABP Suite generates the customizable code pattern incorrectly (or it was partially generated), so the two files end up inheriting from each other:

    • PaymentsAppService.cs inherits from PaymentsAppServiceBase
    • and PaymentsAppServiceBase.cs inherits from PaymentsAppService

    That creates CS0146 Circular base type dependency, and because the base class can’t be compiled, you also see follow-up errors like “ObjectMapper does not exist in the current context” and interface members not implemented.

  • Fix (safe + minimal):

    1. Open PaymentsAppService.cs and PaymentsAppServiceBase.cs and make the inheritance one-way only:

      • PaymentsAppServiceBase must inherit from ABP’s ApplicationService (or CrudAppService<...> depending on what Suite generated).
      • PaymentsAppService must inherit from PaymentsAppServiceBase.
      • Ensure the base class does NOT inherit from the derived class.

      Example of the intended structure:

// PaymentsAppServiceBase.cs
     public abstract class PaymentsAppServiceBase : ApplicationService, IPaymentsAppService
     {
         // generated implementations and protected helpers
     }

     // PaymentsAppService.cs
     public partial class PaymentsAppService : PaymentsAppServiceBase
     {
         // your customizations (can be empty)
     }
  1. After fixing inheritance, ensure PaymentsAppServiceBase ultimately derives from ApplicationService (directly or indirectly). That restores ObjectMapper (it’s provided by ApplicationService), and the interface implementation errors will disappear once the base class compiles.

  2. Clean + rebuild the solution.

  • Practical workaround if you want to avoid manual edits next time:
    • Regenerate the entity without “Preserve custom code / Customizable code” (so Suite generates a single app service file), or delete the generated PaymentsAppService*.cs files and regenerate again (so you don’t keep a broken partial generation state).

No verified source available for this specific ABP Suite code-generation bug (the circular inheritance is a generated-code issue rather than a documented framework 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.

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.

  • In ABP 8.1.5, if you can’t use Integration Services, the recommended alternative for service-to-service authorization with client_credentials is to treat the calling microservice as an OAuth client and check permissions for the client (not a user).
  • Your error (PermissionRequirement: MS1Service.Products) indicates MS1Service is receiving the request, but the permission check is not being granted for the current principal (very commonly because the principal is a client and the permission system is not being evaluated against the Client permission provider in your setup).

Solution (ABP 8.1.5-compatible): Centralize permission checks (works with client_credentials)

Implement remote permission checking through your Identity/Auth server (or your central identity microservice) and have MS1Service/MS2Service delegate permission checks there. This is the “zero-trust” pattern and works before Integration Services.

What you do:

  1. Expose an app service in the Identity/Auth microservice to check permissions for both Users and Clients.

    • When Type == "Client": check with ClientPermissionValueProvider.ProviderName.
    • (Example implementation is in the source below.)
  2. In each microservice (MS1Service, MS2Service, etc.) replace IPermissionChecker with a custom implementation that:

    • Extracts client_id from the current ClaimsPrincipal
    • Calls the Identity/Auth microservice’s “PermissionChecker” endpoint
    • Returns granted/denied to ABP’s authorization pipeline

This makes [Authorize("MS1Service.Products")] succeed for client_credentials as long as the client has been granted that permission in the central permission store.

You can base your implementation on the working sample code below (you can copy the approach as-is in ABP 8.1.5):

  • In Identity/Auth service, CheckPermissionAsync:
if (input.Type.Equals("Client", StringComparison.OrdinalIgnoreCase))
  {
      return await _permissionStore.IsGrantedAsync(
          input.Name,
          ClientPermissionValueProvider.ProviderName,
          input.Id
      );
  }
  • In other services, custom IPermissionChecker:
var clientId = claimsPrincipal.FindClientId();
  var userId = claimsPrincipal.FindUserId()?.ToString();

  return await _permissionAppService.CheckPermissionAsync(new CheckPermissionInput
  {
      Name = name,
      Type = userId == null && clientId != null ? "Client" : "User",
      Id = userId ?? clientId
  });

This approach avoids relying on per-service local permission evaluation nuances for client principals, and it aligns with ABP microservice patterns when you need service identities and explicit permissions.

About “disable auth/permission for internal calls”

If you cannot use Integration Services in 8.1.5, the other user’s suggestion (“an internal app service without auth/permission”) is technically possible, but it’s not equivalent to service-to-service authorization; it effectively bypasses authorization and is not a secure default for microservices.

Sources (validated)

  • https://abp.io/community/articles/xpiz9nvh
  • https://abp.io/docs/latest/framework/fundamentals/authorization#permission-system
  • https://abp.io/docs/latest/solution-templates/microservice/http-api-calls

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 possible to confirm the exact 9.3.x patch version for that fix based on any verified public source I can access right now.

The only verified information available is the support thread you linked, which states: “We will improve it in the next 9.3.x patch version.” but does not mention a specific version number.

If you need a definitive answer (e.g., “fixed in 9.3.3 / 9.3.4 / …”), please contact ABP support via the contact form and reference support question #10057 so they can confirm the exact release that included the improvement:

  • https://abp.io/contact

(Verified)

  • https://abp.io/support/questions/10057

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.

  • Granting the permission to the client (DAS) is necessary, but it’s not sufficient by itself if MS1Service is not configured to evaluate permissions for client principals (client_credentials tokens) or if the access token doesn’t contain the client id in a way ABP can resolve and use for permission checks.
  • UseCurrentAccessToken=false is correct for service-to-service calls (there is no “current user” token to forward). In that mode ABP should obtain a token using the configured IdentityClients:Default settings.

What to do (recommended ABP way)

  1. Ensure MS2Service really sends a client_credentials access token

    • The outgoing request to MS1Service must have: Authorization: Bearer <token>.
    • That token must be issued for the API/scope of MS1Service (you used Scope = "MS1Service" which is the right idea).
  2. Ensure MS1Service authentication is configured with the correct API name/audience

    • In ABP microservice solutions, each microservice API is typically protected by its own API resource name (e.g., ProductService), and the host is configured with:
      • AuthServer:Authority
      • AuthServer:ApiName (the protected resource name)
    • If ApiName/audience doesn’t match what IdentityServer issues for MS1Service, MS1Service may authenticate the token but not map it as expected for permission checks.
  3. Ensure MS1Service permission system supports “Client” permission grants

    • ABP’s permission system can grant permissions not only to Users/Roles, but also to Clients (so a client_credentials token can pass [Authorize(PermissionName)] checks).
    • Practically, that means:
      • The client id must be discoverable from the token (so ABP can treat the current principal as a client).
      • The permission must be granted to that client in the permission store/provider that MS1Service uses.
  4. (If needed) Use centralized/remote permission checking as in ABP microservice patterns

    • In microservice architectures, a common pattern is centralizing permission checks in the Identity service and having other services delegate permission checks there (so permissions granted to clients are evaluated consistently).
    • An implementation example/pattern is shown in the “zero trust microservice architecture” community article (it demonstrates client permission checks via ClientPermissionValueProvider and remote permission checking).

Notes on your specific questions

  • Is granting permission to the Application Client sufficient?
    • It is sufficient only if MS1Service is actually checking permissions for the authenticated principal as a client (not as a user/anonymous) and the token contains the proper client identity.
  • Any additional configuration in UseCurrentAccessToken or AbpAuthorizationOptions?
    • UseCurrentAccessToken=false is the right setting for client_credentials.
    • The problem is typically not AbpAuthorizationOptions, but that MS1Service is not resolving the principal as a “client” permission grantee (or the token/audience configuration doesn’t match).

Sources

  • https://abp.io/docs/latest/samples/microservice-demo
  • https://abp.io/docs/latest/framework/fundamentals/authorization#permission-system
  • https://abp.io/community/articles/xpiz9nvh

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
  • This happens because your create command explicitly tells ABP Studio/CLI not to run the frontend setup steps for the Angular app:

    • --dont-run-install-libs
    • --dont-run-bundling

    In tiered + Angular solutions, ABP generates the Angular UI under the angular/ folder and then (normally) runs additional steps to prepare it. If you skip these, the Angular workspace may be left in an unprepared/partial state, which can look like “missing Angular files” (e.g., package.json, angular.json) depending on what exactly was generated vs. what was supposed to be restored/prepared afterward.

  • To ensure all required Angular files are created:

    1. Create the solution without those flags (recommended):
abp new Analision -t app --tiered --ui-framework angular --database-provider ef --database-management-system postgresql --theme leptonx --separate-tenant-schema --skip-migration --skip-migrator --without-cms-kit --sample-crud-page
 (i.e., remove `--dont-run-install-libs` and `--dont-run-bundling`)
  1. If the solution is already created, ensure you are checking the correct location:

    • The Angular app root is the angular/ folder (at the solution root, next to aspnet-core/ in Angular UI solutions).
  2. Then follow the Angular quick-start expectations (Angular project root should include angular.json, package.json, etc.). If dependencies weren’t installed automatically, install them manually in the angular/ folder:

cd angular
     yarn

  • https://abp.io/docs/10.1/suite/solution-structure
  • https://abp.io/docs/10.1/framework/ui/angular/quick-start

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 issue/bug in the Payment module’s MongoDB model mapping (reproducible in v10.0.0 and v10.1.0 as you observed): the Plan entity’s MongoDB collection name is not being configured with PaymentDbProperties.DbTablePrefix, so it falls back to the default convention and ends up as Plans, while PaymentRequest correctly becomes PayPaymentRequests.
  • Workaround (recommended until fixed in a patch): keep your current override in your MongoDbContext’s CreateModel (or OnModelCreating equivalent for Mongo) and force the collection name for Plan (and optionally PaymentRequest) after calling modelBuilder.ConfigurePayment():
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
    base.CreateModel(modelBuilder);

    modelBuilder.ConfigurePayment();

    // Workaround: enforce prefix for collections that are incorrectly mapped
    modelBuilder.Entity<Volo.Payment.Plans.Plan>(b =>
    {
        b.CollectionName = PaymentDbProperties.DbTablePrefix + "Plans";
    });

    // Optional safety (this one is already correct in your case)
    modelBuilder.Entity<Volo.Payment.PaymentRequests.PaymentRequest>(b =>
    {
        b.CollectionName = PaymentDbProperties.DbTablePrefix + "PaymentRequests";
    });
}
  • Result: New writes will go into PayPlans as documented (instead of Plans). If you already have data in Plans, you’ll need to migrate/rename the existing collection in MongoDB (ABP won’t automatically move documents).

  • If you want to keep the workaround minimal: only override Plan since PaymentRequest is already correct in your environment.

Sources:

  • https://abp.io/docs/latest/modules/payment

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 441 to 450 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.