BEST
DEALS
OF THE
YEAR!
SAVE UP TO $3,000
LAST DAY 1 DEC
00 Days
00 Hrs
00 Min
00 Sec
Open Closed

Tenant header __tenant on k8s ingress #10078


User avatar
0
andmattia created

ABP 7.4.5

I try to do conncetion via authserv/connect/token in k8s but no tenant __tenant receive via k8s.

Can you provide us a configuration template tu use it in this scenario?


2 Answer(s)
  • User Avatar
    0
    AI-Bot created
    Support Team ABP Agent
    1. Solution The __tenant header is blocked by many ingress controllers (NGINX, Azure App Gateway, etc.) because it contains underscores. ABP can resolve the current tenant from multiple sources; in Kubernetes you have two reliable options:

    A) Keep using the header, but allow underscores through your ingress

    • For NGINX Ingress Controller:

      • Add these annotations to your Ingress so NGINX accepts and forwards the __tenant header:
        • nginx.ingress.kubernetes.io/enable-underscores-in-headers: "true"
        • nginx.ingress.kubernetes.io/proxy-hide-headers: "" (ensures it doesn’t hide the header)
      • Example: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: auth-server annotations: nginx.ingress.kubernetes.io/enable-underscores-in-headers: "true" nginx.ingress.kubernetes.io/proxy-body-size: "10m" nginx.ingress.kubernetes.io/proxy-buffering: "off" # optionally preserve all headers nginx.ingress.kubernetes.io/proxy-hide-headers: "" spec: ingressClassName: nginx rules: - host: auth.mycompany.com http: paths: - path: / pathType: Prefix backend: service: name: auth-server port: number: 80
    • For plain NGINX (not ingress), ensure:

      • underscores_in_headers on;

      • and don’t use ignore_invalid_headers on; (or set off)

      • Reference config snippet: server { listen 443 ssl; server_name auth.mycompany.com;

        underscores_in_headers on;
        # ignore_invalid_headers off;  # if you have it on, headers with underscore are dropped
        
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://auth-server-svc;
        }
        

        }

    • Ensure your ABP app still has the header resolver enabled (it is by default): Configure<AbpTenantResolveOptions>(options => { options.AddHeaderTenantResolver(); // default uses "__tenant" });

    • Then you can request tokens with the header set: POST https://auth.mycompany.com/connect/token Headers: __tenant: my-tenant Content-Type: application/x-www-form-urlencoded Body: grant_type=password&client_id=...&client_secret=...&username=...&password=...

    B) Avoid the header; use domain or query string based tenant resolution If your ingress cannot be changed, switch to a resolver that does not use underscores.

    • Subdomain/domain based resolution:

      • Configure ABP to resolve tenant from subdomain: Configure<AbpTenantResolveOptions>(options => { // e.g. my-tenant.auth.mycompany.com options.AddDomainTenantResolver("{0}.auth.mycompany.com"); });
      • Issue token requests to https://my-tenant.auth.mycompany.com/connect/token without any __tenant header.
    • Query string fallback (for non-browser/token scenarios):

      • ABP supports query-string resolution: Configure<AbpTenantResolveOptions>(options => { options.AddQueryStringTenantResolver(); // looks for ?__tenant=... });
      • Call: POST https://auth.mycompany.com/connect/token?__tenant=my-tenant

    Important ABP middleware order (for the token endpoint and all APIs)

    • Ensure multi-tenancy runs after authentication so the tenant can be resolved from claims/header: public void Configure(IApplicationBuilder app) { app.UseCorrelationId(); app.UseRouting(); app.UseAuthentication(); app.UseMultiTenancy(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }

    Quick verification checklist

    • Ingress accepts underscores (Option A) or you use subdomain/query (Option B).
    • The client actually sends the tenant (header, subdomain, or query).
    • AuthServer and API services include AddHeaderTenantResolver/AddDomainTenantResolver/AddQueryStringTenantResolver as needed (in most cases defaults already include header/query).
    • Middleware order has UseMultiTenancy after UseAuthentication.
    1. Sources
    • NGINX core docs (underscores in headers):
      • http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers
      • http://nginx.org/en/docs/http/ngx_http_core_module.html#ignore_invalid_headers
    • ABP source (Multi-tenancy ASP.NET Core options showing tenant key and resolvers):
      • https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs

    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.

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    Can you try --set controller.config.enable-underscores-in-headers="true"?

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    helm upgrade --install --version=4.0.19 ingress-nginx ingress-nginx/ingress-nginx --set controller.config.enable-underscores-in-headers="true"
    
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 November 20, 2025, 09:12
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.