Activities of "papusa"

Hi!

When provideThemeLeptonX() is used with withThemeLeptonXOptions(), the settings menu shows hardcoded English labels (e.g. "General Settings", "Language Options") instead of localized strings from the LeptonX resource, even when translations exist on the backend.

Steps to reproduce:

  • Configure LeptonX with theme options:
provideThemeLeptonX(
  withThemeLeptonXOptions({
    defaultTheme: 'dim',
  }),
),
  • Switch the UI language to Swedish (or another non-English locale).
  • Open the settings menu (gear icon).
  • Observe that "General Settings" and "Language Options" remain in English.

Root cause looks like a provider order issue: withThemeLeptonXOptions causes DefaultTranslateService to override AbpTranslateService.

I found a workaround, re-registering the ABP translate provider after provideThemeLeptonX(...) is solving the issue:

provideThemeLeptonX(
  withThemeLeptonXOptions({ /* ... */ }),
),
LPX_TRANSLATE_PROVIDER,

However, I think it still should be fixed on ABP side.

n ABP 10.1.1, a feature defined with .WithProviders(TenantFeatureValueProvider.ProviderName) still appears in the SaaS Edition Features dialog and can be saved for provider E. However, runtime IFeatureChecker appears to filter value providers by FeatureDefinition.AllowedProviders, so edition values for that feature are ignored and only tenant values are considered.

Could you clarify whether AllowedProviders is intended to restrict only runtime feature value providers, or also Feature Management UI/API providers? If it is runtime-only, should the Edition Features dialog hide or disable features whose AllowedProviders does not include E, to avoid saving values that runtime checks will not use?

In ABP 9.3, when an application service method accepts an input DTO that contains IRemoteStreamContent (including multiple files, e.g., IEnumerable<IRemoteStreamContent>), the Angular proxy generator (abp generate-proxy -t ng) generates a proxy method that posts a JSON body (body: request) instead of a multipart/form-data request (FormData). This makes the generated proxy method unusable for uploads, since IRemoteStreamContent represents a file and cannot be sent as JSON. This appears inconsistent with the ABP documentation for v9.3, which explicitly describes DTO usage and indicates that IRemoteStreamContent is compatible with Auto API Controller and Dynamic C# HTTP Proxy systems, and that DTO types must be added to FormBodyBindingIgnoredTypes for DTO scenarios. Reference: ABP 9.3 docs – Working with Streams.

Hi, This is a continuation of my previous ticket.

In my application, some actions should only be allowed when the user is authenticated via BankID (external login). I’m looking for a way to force a user to log in with a specific provider. So far, the only approach I found is overriding the LoginModel. While it works, it feels like a hack and may not be the recommended way.

navigateToBankIdLogin(){
    this.authService.navigateToLogin({
      prompt: 'login',
      bankid: true
    });
  }
[ExposeServices(typeof(Volo.Abp.Account.Public.Web.Pages.Account.LoginModel))]
public class LoginModel : Volo.Abp.Account.Public.Web.Pages.Account.LoginModel
{
    public LoginModel(IAuthenticationSchemeProvider schemeProvider,
        IOptions<AbpAccountOptions> accountOptions, IAbpRecaptchaValidatorFactory recaptchaValidatorFactory,
        IAccountExternalProviderAppService accountExternalProviderAppService,
        ICurrentPrincipalAccessor currentPrincipalAccessor, IOptions<IdentityOptions> identityOptions,
        IOptionsSnapshot<reCAPTCHAOptions> reCaptchaOptions) : base(schemeProvider, accountOptions,
        recaptchaValidatorFactory, accountExternalProviderAppService, currentPrincipalAccessor, identityOptions,
        reCaptchaOptions)
    {
    }

    public override Task<IActionResult> OnGetAsync()
    {
        return ShouldForceBankIdLogin()
            ? base.OnPostExternalLogin(MachineRegistryConsts.BankIdLoginProviderName)
            : base.OnGetAsync();
    }

    private bool ShouldForceBankIdLogin()
    {
        if (ReturnUrl.IsNullOrEmpty())
        {
            return false;
        }
        
        var decodedReturnUrl = HttpUtility.UrlDecode(ReturnUrl);
        return decodedReturnUrl.Split("&").Any(p => p.Equals("bankid=true", StringComparison.OrdinalIgnoreCase));
    }
}

Additionally, there’s a UI/flow issue: I have to click the login button twice before the user is navigated to the BankID login, even though the prompt is set to 'login'. Bellow is a gif showing the issue: Could you advise on the recommended ABP way to enforce external login for specific actions and/or address the double-click issue?

Hi, I previously opened a ticket regarding external login with BankID, and I now have three additional questions:

Recognizing login type

  • Is it possible to determine whether the user logged in with a local account or via an external login (e.g., BankID)? I'd like to make certain decisions based on the login method used.

Adding login type claim

  • Is it possible to include a custom claim in both the access_token and the id_token?

Handling BankID-only actions There are some actions in my application that must only be allowed when a user is authenticated via BankID (external login).

  • If the user does not yet have an external login, they should be prompted to add it.
  • When a user adds an external login, it goes through the BankID login flow. However, when the request returns to the ABP application, the claims contributors are missing, so I cannot add any claim that marks the user as BankID-authenticated.
  • This results in the user having to authenticate with BankID twice, which is not ideal.

Is there a recommended way to handle this scenario to avoid requiring double BankID authentication?

We have integrated an external login provider (BankID) into our ABP application v9 (Layered/Angular/No separate auth). Login flow works, but two issues remain regarding claims handling and distinguishing login type:

  1. Forwarding External Claims
  • During the external login callback, BankID provides additional claims (e.g., national identity number, date of birth).
  • I can see these claims in the external cookie (IdentityConstants.ExternalScheme).
  • However, once ABP finalizes the login and issues tokens for the Angular app, these claims are gone.
  • I tried implementing IAbpClaimsPrincipalContributor to forward them, but the external cookie is not available for angular app (different domain/port).
  • Question: What is the proper ABP way to forward external provider claims (without persisting sensitive values like national identity number in the DB) so that they appear in the JWT used by the Angular client?
  1. Recognizing Authentication Type in API Calls
  • For security logic, I need to know if the current user authenticated via BankID or the standard username/password login.
  • In Swagger tests, I can inject and see custom claims, but once Angular is used, claims seem to be rewritten and the info is lost.
  • Question: What is the recommended approach in ABP to tag the authentication method (e.g., extenal (BankID) vs. local) so that this info reliably propagates into JWT tokens consumed by the Angular frontend?

Notes: I don’t want to persist national identity number in the database, so I’m looking for a runtime claim-forwarding approach. I’ve already explored AbpUserClaimsPrincipalFactory and IAbpClaimsPrincipalContributor. Claims show up in Swagger tests but not from Angular.

Hello,

I've encountered another issue with entity extension regarding UI localization. Here's the code I'm working with: property.DisplayName = new FixedLocalizableString("Label:BirthDate"); The label translates correctly in the "Create" and "Edit" forms, but it doesn't translate in the table headers. When I add :: before the localization key, the label is correctly translated in the table headers, but the "Create/Edit" forms show an empty string instead.

Could you please assist with resolving this?

Hi! I need to add a couple of extra properties to the IdentityUser. One of these properties will represent the date of birth, and I would like its type to be DateOnly.


Below is my current code: EfCoreEntityExtensionMappings

            ObjectExtensionManager.Instance.MapEfCoreProperty<IdentityUser, string>(
                UserExtraPropertyNames.NationalIdentityNumber,
                (_, propertyBuilder) =>
                {
                    propertyBuilder.IsRequired();
                    propertyBuilder.HasColumnType("varchar(11)");
                });

            ObjectExtensionManager.Instance.MapEfCoreProperty<IdentityUser, DateOnly>(
                UserExtraPropertyNames.BirthDate,
                (_, propertyBuilder) =>
                {
                    propertyBuilder.IsRequired();
                });

ExtensionConfigurator

ObjectExtensionManager.Instance.Modules().ConfigureIdentity(identity =>
        {
            identity.ConfigureUser(user =>
            {
                user.AddOrUpdateProperty<string>(UserExtraPropertyNames.NationalIdentityNumber, property =>
                {
                    property.Attributes.Add(new RequiredAttribute());
                    property.Attributes.Add(new StringLengthAttribute(11) { MinimumLength = 11 });
                });
                
                user.AddOrUpdateProperty<DateOnly>(UserExtraPropertyNames.BirthDate, property =>
                {
                    property.DefaultValueFactory = () => DateOnly.FromDateTime(DateTime.Today);
                    
                    property.Validators.Add(context =>
                    {
                        
                    });
                });
            });
        });


The BirthDate property is never set and always has the default value of 0001-01-01 when a new user is created. I believe the issue is related to type casting. The BirthDate property has a DateTime type instead of DateOnly, which might be causing the problem.

Do you have any suggestions on how I can fix this?

Thanks!

Question

Hangfire jobs attribute [AutomaticRetry] doesn't work. Is there any way to use ABP background jobs abstractions and have different retry setup for different jobs?

Thanks.

Hi,

We have a requirement to add some additional tab to user edit modal (see screenshot below):

Is there any possibility to customise it without replacing entire users component?

Thanks.

  • ABP Framework version: v6.0.1
  • UI type: Angular /
Showing 1 to 10 of 13 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.