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:
provideThemeLeptonX(
withThemeLeptonXOptions({
defaultTheme: 'dim',
}),
),
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
Adding login type claim
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).
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:
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!
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.