Practical approach (recommended sequence)
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.
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+).
You can see it explicitly stated in the migration guide: “Since YARP is available with ABP v8.0+, you will need to update…”
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.
public class PaymentsAppService : PaymentsAppService, IPaymentsAppService — i.e., the class is inheriting from itself, which produces CS0146 (“Circular base type dependency involving 'PaymentsAppService' and 'PaymentsAppService'”).ObjectMapper does not exist (because the generated class no longer successfully derives from ApplicationService).Payments.Application, delete:
PaymentsAppService.csPaymentsAppServiceBase.cs, PaymentsAppService.Extended.cs, etc. if they exist)bin/obj folders (or run dotnet clean).: 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:
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.
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 PaymentsAppServiceBasePaymentsAppServiceBase.cs inherits from PaymentsAppServiceThat 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):
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.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)
}
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.
Clean + rebuild the solution.
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.
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).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:
Expose an app service in the Identity/Auth microservice to check permissions for both Users and Clients.
Type == "Client": check with ClientPermissionValueProvider.ProviderName.In each microservice (MS1Service, MS2Service, etc.) replace IPermissionChecker with a custom implementation that:
client_id from the current ClaimsPrincipalThis 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):
CheckPermissionAsync:if (input.Type.Equals("Client", StringComparison.OrdinalIgnoreCase))
{
return await _permissionStore.IsGrantedAsync(
input.Name,
ClientPermissionValueProvider.ProviderName,
input.Id
);
}
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.
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.
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:
(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.
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.Ensure MS2Service really sends a client_credentials access token
Authorization: Bearer <token>.Scope = "MS1Service" which is the right idea).Ensure MS1Service authentication is configured with the correct API name/audience
ProductService), and the host is configured with:
AuthServer:AuthorityAuthServer:ApiName (the protected resource name)ApiName/audience doesn’t match what IdentityServer issues for MS1Service, MS1Service may authenticate the token but not map it as expected for permission checks.Ensure MS1Service permission system supports “Client” permission grants
[Authorize(PermissionName)] checks).(If needed) Use centralized/remote permission checking as in ABP microservice patterns
ClientPermissionValueProvider and remote permission checking).UseCurrentAccessToken or AbpAuthorizationOptions?
UseCurrentAccessToken=false is the right setting for client_credentials.AbpAuthorizationOptions, but that MS1Service is not resolving the principal as a “client” permission grantee (or the token/audience configuration doesn’t match).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 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-bundlingIn 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:
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`)
If the solution is already created, ensure you are checking the correct location:
angular/ folder (at the solution root, next to aspnet-core/ in Angular UI solutions).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
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.
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.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:
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.