Activities of "aziz.bouhejba"

Hello,

I’d like to confirm whether the FullCalendar license is included with the LeptonX theme purchase, or if it needs to be obtained separately. Could you please clarify how licensing for FullCalendar is handled when using LeptonX?

We’ve integrated it into our .NET MAUI Blazor Hybrid app, and it works great! We’d just like to confirm whether it’s already covered under our ABP and LeptonX licenses.

Thank you for your help!

Hi, we followed your documentation to get a Blazorise product token and it works great. We also have an app matching your template of web assembly Blazor app.

We're trying to secure the product token and not serve it in app settings or whatever so it's not public but can't find a way.

We have an Azure key vault in the host project that we can contact to get the token but we can't pass the value to the web assembly.

Any way to do this properly?

Thanks

ABP Framework Version: 9.2 Project Type: Microservices template with MAUI Blazor Hybrid app Platform: Android (Samsung devices) Affected Models: S21 FE, S24 (consistently reproducible)

Issue: Application displays white screen and crashes when battery optimization is enabled

Root Cause: Samsung's aggressive battery optimization appears to block network requests during app resume, causing ABP module initialization to fail when attempting to fetch application configuration.

Reproduction Steps:

  1. Set app battery settings to "Optimized" or "Restricted"
  2. Launch app and complete login
  3. Close app without logging out (background the app)
  4. Reopen the app

Expected Result: App resumes normally with existing session Actual Result: White screen with AbpInitializationException

Key Error: Java.Net.UnknownHostException: Unable to resolve host "localhost"

Attempted Solutions:

  • Implemented Polly retry policies following https://abp.io/docs/latest/framework/api-development/dynamic-csharp-clients#retry-failure-logic-polly-integration

Business Impact:

  • Samsung devices represent significant market share
  • Default battery optimization settings cause app failure
  • Users experience appears broken after backgrounding

Potential Solutions Needed:

  1. Graceful handling of network failures during module initialization
  2. Option to skip/defer configuration refresh on app resume
  3. Better error handling for battery optimization scenarios
  4. Guidance for Samsung-specific battery whitelist recommendations

Additional Context:

  • Issue is specific to Samsung devices with battery optimization
  • Other Android manufacturers not affected
  • Problem occurs during MauiBlazorCachedApplicationConfigurationClient.InitializeAsync()

Full exception

[2025-09-11 13:28:41] Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.Components.MauiBlazor.AbpAspNetCoreComponentsMauiBlazorModule, Volo.Abp.AspNetCore.Components.MauiBlazor, Version=9.2.0.0, Culture=neutral, PublicKeyToken=null: An error occurred during the ABP remote HTTP request. (Connection failure) See the inner exception for details.. See the inner exception for details. ---> Volo.Abp.Http.Client.AbpRemoteCallException: An error occurred during the ABP remote HTTP request. (Connection failure) See the inner exception for details. ---> System.Net.Http.HttpRequestException: Connection failure ---> Java.Net.UnknownHostException: Unable to resolve host "localhost": No address associated with hostname ---> Java.Lang.RuntimeException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)

--- End of managed Java.Lang.RuntimeException stack trace --- android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname) at libcore.io.Linux.android_getaddrinfo(Native Method) at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:133) at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:222) at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:133) at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:135) at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103) at java.net.InetAddress.getAllByName(InetAddress.java:1152) at com.android.okhttp.Dns$1.lookup(Dns.java:41) at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:178) at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144) at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:86) at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:176) at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128) at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465) at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131) at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90) at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)

Hello!

I am implementing tenant-specific branding in an ABP application with LeptonX Theme. The settings are saving correctly per tenant, but I cannot get the styles to apply using Layout Hooks.

Environment:

  • ABP Version: 9.2
  • UI Framework: Blazor WebApp (also tried with Auth Server MVC)
  • Theme: LeptonX Theme
  • Project Type: Microservice solution

What I'm trying to achieve: Apply custom colors per tenant using CSS variables injected into the page head.

What I've tried: Following these documentation links:

  • https://abp.io/community/articles/white-labeling-in-abp-framework-5trwmrfm#gsc.tab=0
  • https://abp.io/docs/latest/framework/ui/blazor/layout-hooks

The Problem:

Configure<AbpLayoutHookOptions>(options =>
{
    options.Add(
        LayoutHooks.Head.Last,  // This does NOT work - component never renders in my <Head> html
        typeof(AppearanceStylesComponent)
    );
    
    options.Add(
        LayoutHooks.Body.First,  // This WORKS - component renders correctly
        typeof(TestStyleComponent)
    );
});

Hello,

We're integrating CmsKitPro into a Blazor Web App, and currently have the following setup:

  • CmsKitProAdminBlazorWebAssemblyModule added to the WebApp.Client (WASM) project
  • CmsKitProAdminWebModule added to the WebApp (Server) project

The issue we're experiencing is that the UI between the two modules appears inconsistent. And:

When we navigate to a CmsKit page (e.g., from the blogs menu) and reload the browser, the app falls back to the server-side view, which looks bugged or non-functional.

If we navigate elsewhere in the app and then return to the CMS section, it starts working again as expected — showing the correct WASM view.

Do you have any idea what might be causing this behavior? Is there a best practice for integrating CmsKitPro in a Blazor WebApp app to avoid this?

Other infos, we have the back-end part setup in a microservice and it works well on the wasm to create/edit blogs and posts.

Thanks for your help!

Hello, we noticed that when demote/change the role of someone, it doesn't get reflected instantly. we figured it's because caching. but we thought UseDynamicClaims covered that case.

We don't want an admin that we demote to a simple guest to still have admin powers for an hour and thought it should be working out of the box.

This is issue is noticeable in our blazor app and our maui blazor hybrid mobile app.

We tried adding a middleware in identity service to replace the claims by the current role claims but it didn't work.

Do you have any suggestions?

Hello, we are using a Blazor Maui Hybrid app as a mobile application that targets android and iOS. We have our backend using the microservices template, with an auth server. We use the oidc code flow to login and get our permissions. We have two menu items hidden behind permissions :

    //FileManagement
    context.Menu.AddItem(
        new ApplicationMenuItem(
            ProjectMenus.FileManagement,
            l["Menu:FileManagement"],
            ProjectRoutes.FileManagement,
            icon: "fa fa-folder-open",
            order: 5
        ).RequirePermissions(FileManagementPermissions.FileDescriptor.Default)

We have found no other solution than a Task.Delay after the TriggerUserChanged() in our project CodeFlowExternalAuthService :

public class ProjectCodeFlowExternalAuthService : ExternalAuthServiceBase
{
    private readonly OidcClient _oidcClient;
    private readonly IStorage _storage;

    public ProjectCodeFlowExternalAuthService (
        IAccessTokenStore accessTokenStore,
        IStorage storage,
        OidcClient oidcClient)
        : base(accessTokenStore)
    {
        _oidcClient = oidcClient;
        _storage = storage;
    }

    public async override Task<LoginResult> LoginAsync(LoginInput input)
    {
        var loginResult = await _oidcClient.LoginAsync(new LoginRequest());
        if (loginResult.IsError)
        {
            return LoginResult.Failed(loginResult.Error, loginResult.ErrorDescription);
        }

        await SetTokenCacheAsync(loginResult.AccessToken, loginResult.RefreshToken);
        var currentUser = new ClaimsPrincipal(new ClaimsIdentity(new JwtSecurityTokenHandler().ReadJwtToken(loginResult.AccessToken).Claims, AuthenticationType));
        TriggerUserChanged(currentUser);

        // Our hack that needs to be more than 500 when we're deployed
        await Task.Delay(500);

        return LoginResult.Success();
    }

    public async override Task SignOutAsync()
    {
        var logoutResult = await _oidcClient.LogoutAsync();
        await ClearTokenCacheAsync();

        var currentUser = new ClaimsPrincipal(new ClaimsIdentity());
        TriggerUserChanged(currentUser);

        // Our hack that needs to be more than 500 when we're deployed
        await Task.Delay(500);
    }

    public async Task<string> GetAccessTokenAsync()
    {
        var token = await _storage.GetAsync(OidcConsts.AccessTokenKeyName);

        if (!token.IsNullOrEmpty())
        {
            var jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token);
            if (jwtToken.ValidTo <= DateTime.UtcNow)
            {
                var newToken = await TryRefreshTokenAsync();

                if (!newToken.IsNullOrEmpty())
                {
                    return newToken;
                }
            }
        }

        return token;
    }

    public async Task<string> TryRefreshTokenAsync()
    {
        var refreshToken = await _storage.GetAsync(OidcConsts.RefreshTokenKeyName);

        if (!refreshToken.IsNullOrEmpty())
        {
            var refreshResult = await _oidcClient.RefreshTokenAsync(refreshToken);

            if (!refreshResult.IsError)
            {
                await SetTokenCacheAsync(refreshResult.AccessToken, refreshResult.RefreshToken);

                return refreshResult.AccessToken;
            }
        }

        return string.Empty;
    }

    private async Task SetTokenCacheAsync(string accessToken, string refreshToken)
    {
        await AccessTokenStore.SetAccessTokenAsync(accessToken);
        await _storage.SetAsync(OidcConsts.AccessTokenKeyName, accessToken);
        await _storage.SetAsync(OidcConsts.RefreshTokenKeyName, refreshToken);
    }

    private async Task ClearTokenCacheAsync()
    {
        await AccessTokenStore.SetAccessTokenAsync(null);

        await _storage.RemoveAsync(OidcConsts.AccessTokenKeyName);
        await _storage.RemoveAsync(OidcConsts.RefreshTokenKeyName);
    }
}

I'm sure the framework offers a better alternative to propagate the permissions change to the menus using the AuthState. I can't see how.. This issue happens on the first login only (without the Delay), if we close and open the app, the menus are shown.

So the permissions are propagating but not fast enough or the menus aren't notified of the change..

Thank you in advance for your answer!

Showing 1 to 7 of 7 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.1.0-preview. Updated on October 30, 2025, 06:33