{"record":{"id":"19381b7c15bea74f","repo":"aspnetboilerplate/aspnetboilerplate","slug":"invalidtenancyname","errorCode":null,"errorMessage":"InvalidTenancyName","messagePattern":"InvalidTenancyName","errorType":"validation","errorClass":"UserFriendlyException","httpStatus":null,"severity":"error","filePath":"src/Abp.Zero.Common/MultiTenancy/AbpTenantManager.cs","lineNumber":428,"sourceCode":"                }\n            });\n        }\n\n        protected virtual async Task ValidateTenantAsync(TTenant tenant)\n        {\n            await ValidateTenancyNameAsync(tenant.TenancyName);\n        }\n\n        protected virtual void ValidateTenant(TTenant tenant)\n        {\n            ValidateTenancyName(tenant.TenancyName);\n        }\n\n        protected virtual Task ValidateTenancyNameAsync(string tenancyName)\n        {\n            if (!Regex.IsMatch(tenancyName, AbpTenant<TUser>.TenancyNameRegex))\n            {\n                throw new UserFriendlyException(L(\"InvalidTenancyName\"));\n            }\n\n            return Task.FromResult(0);\n        }\n\n        protected virtual void ValidateTenancyName(string tenancyName)\n        {\n            if (!Regex.IsMatch(tenancyName, AbpTenant<TUser>.TenancyNameRegex))\n            {\n                throw new UserFriendlyException(L(\"InvalidTenancyName\"));\n            }\n        }\n\n        protected virtual string L(string name)\n        {\n            return LocalizationManager.GetString(LocalizationSourceName, name);\n        }\n","sourceCodeStart":410,"sourceCodeEnd":446,"githubUrl":"https://github.com/aspnetboilerplate/aspnetboilerplate/blob/2323c13a152aa0ebfb37af3830f687d7f5b53795/src/Abp.Zero.Common/MultiTenancy/AbpTenantManager.cs#L410-L446","documentation":"AbpTenantManager.ValidateTenancyNameAsync checks the tenancy name against AbpTenant<TUser>.TenancyNameRegex (by default ^[a-zA-Z][a-zA-Z0-9_-]{1,31}$ i.e. must start with a letter, be 2-32 chars of letters/digits/underscore/dash). If the name doesn't match, it throws UserFriendlyException with the localized 'InvalidTenancyName' message. This is called from ValidateTenantAsync during CreateAsync/UpdateAsync.","triggerScenarios":"Creating or updating a tenant (CreateAsync/UpdateAsync → ValidateTenantAsync) whose TenancyName fails the regex: empty string, contains spaces or special characters, starts with a digit, or is longer than 32 characters.","commonSituations":"Sign-up forms that don't validate the tenant name client-side (allowing spaces or dots like 'my.company'); tenants named with uppercase/convention-violating input; customized TenancyNameRegex in a newer version breaking previously valid names; white-label imports with legacy naming.","solutions":["Validate the tenancy name against TenancyNameRegex before calling CreateAsync/UpdateAsync and return a field-level validation error.","Normalize user input: trim, remove spaces/special characters, convert to the allowed charset.","If your project overrides TenancyNameRegex, ensure the new pattern matches your existing tenants before deploying."],"exampleFix":"// before\nawait _tenantManager.CreateAsync(new Tenant(userInput, name)); // throws for \"my company!\"\n// after\nvar tenancyName = Regex.Replace(userInput.Trim(), \"[^a-zA-Z0-9_-]\", \"\");\nif (!Regex.IsMatch(tenancyName, AbpTenant<CartItem>.TenancyNameRegex))\n    return BadRequest(\"Tenancy name must start with a letter and be 2-32 chars (letters, digits, - or _).\");\nawait _tenantManager.CreateAsync(new Tenant(tenancyName, name));","handlingStrategy":"validation","validationCode":"bool valid = Regex.IsMatch(tenancyName ?? \"\", AbpTenant<AbpUserBase>.TenancyNameRegex);\nif (!valid) throw new UserFriendlyException(\"Invalid tenancy name: must start with a letter, 2-32 chars of letters/digits/-/_.\");","typeGuard":"bool IsValidTenancyName(string name) =>\n    !string.IsNullOrEmpty(name) && Regex.IsMatch(name, AbpTenant<AbpUserBase>.TenancyNameRegex);","tryCatchPattern":"try { await _tenantManager.CreateAsync(tenant); }\ncatch (UserFriendlyException ex) when (ex.Message == _l(\"InvalidTenancyName\")) { ModelState.AddModelError(\"TenancyName\", ex.Message); return View(model); }","preventionTips":["Enforce TenancyNameRegex client-side in sign-up forms","Sanitize/normalize names before validation","Review custom TenancyNameRegex overrides before upgrading ABP"],"tags":["abp","multi-tenancy","validation","regex"],"backgroundTag":"invalid-identifier-format","analyzedSha":"2323c13a152aa0ebfb37af3830f687d7f5b53795","analyzedAt":"2026-09-08T08:00:50.638Z","contentChangedAt":"2026-09-08T08:00:50.638Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}