[maliming] said: hi
Issue 1: Host (Super Admin) Login Issue
Please check the debug logs see what happened?
https://abp.io/support/questions/8622/How-to-enable-Debug-logs-for-troubleshoot-problems
Can you also share an online URL and test user and password?
liming.ma@volosoft.com
Thanks.
we will update you with this details give us some time
Hello ABP Support Team,
We are currently implementing domain-based tenant resolution and have been following the official ABP blog below for the implementation steps:
https://abp.io/community/articles/how-to-use-domainbased-tenant-resolver-in-abp-with-angular-and-openiddict-v9y8da7v#step-2-configure-http-for-local-development-optional
Frontend: Angular
Backend: .NET 9.0
ABP Framework Version: 9.0.4
Authentication: OpenIddict
Multi-tenancy: Domain-based tenant resolver
Both the frontend and backend are running correctly, and the backend URLs are accessible for specific tenant domains.
However, we are facing the following two issues:
We have renamed the Host Admin to Super Admin. When attempting to log in as the Super Admin:
The login screen remains stuck and does not proceed further.
If an incorrect password is entered, the error message is displayed correctly.
This indicates that authentication validation is occurring, but the login flow is not completing successfully.
The same behavior occurs when attempting to log in from the backend as well (i.e., Super Admin login is not working from either Angular or backend).
For tenant-specific domains:
The tenant frontend loads correctly.
However, when navigating to the login screen from the Angular frontend, an OpenIddict-related error occurs.
This issue does not occur when accessing the login screen directly from the backend.
This behavior suggests a possible issue with OpenIddict, tenant resolution during the Angular-based login flow.
The correct way to handle host users login when domain-based tenant resolution is enabled.
Any additional configuration required for Angular + OpenIddict login when using tenant subdomains.
Whether there are known limitations or required settings for this setup in ABP 9.0.4.
Please let us know if you need any additional details, logs, or configuration snippets from our side.
Thank you for your support.
Best regards, Rishikesh
Hello ABP Support Team,
I’m facing a critical issue while restoring NuGet packages for my ABP 8.3.4 project. Every time I run dotnet restore, I get the following repeated error:
NU1301: Unable to load the service index for source https://nuget.abp.io/nuget/v3/index.json. Response status code does not indicate success: 500 (Internal Server Error).
What I Have Tried: Cleared local NuGet cache: dotnet nuget locals all --clear Disabled ABP NuGet feed in NuGet.Config and re-enabled it Ran restore with --disable-parallel and --no-cache Confirmed the error is consistently coming from the ABP NuGet feed
My Project Details: ABP Version: 8.3.4 UI: Angular Backend: .NET 8 Operating System: Windows 10 ABP Feed URL: https://nuget.abp.io/nuget/v3/index.json
Please let me know if the ABP feed is currently having server-side issues or if there is a workaround to complete package restore and proxy generation. Thank you in advance.
Best regards, Rishikesh
Hi,
Thank you for the information.
We’ve collected the debug logs for issue #9502 – "Cypress POST Requests Returning 400 Bad Request – Works Fine in Browser" and have sent them directly via email to liming.ma@volosoft.com.
Please confirm once received. Let us know if any additional details are needed.
Thanks
Hi,
Thank you for the response.
We’ve enabled debug logging as per the instructions provided in this guide.
Could you please let us know the preferred way to share the debug log files with you for the 400 error issue we’re encountering?
Looking forward to your guidance.
Best regards, Rishikesh Tuniki
hi we have used the recommendations from the answer you have provided added this in the HttpApiHostModule > configureServices method Configure<AbpAntiForgeryOptions>(options => { options.TokenCookie.Domain = ".aumtech.org"; // Use your actual parent domain options.TokenCookie.SecurePolicy = CookieSecurePolicy.None; options.TokenCookie.SameSite = SameSiteMode.Lax; // or SameSiteMode.None if using HTTPS });
we still received the same error
and 4th point id not applicable as we are using data center Linux server for hosting
Hi ABP Support Team,
We are currently facing an issue while running Cypress automation tests in our ABP-based application.
We have deployed the project with two separate subdomains:
* One for the frontend (Angular).
* Another for the backend (ABP MVC API).
The application works perfectly when accessed through a regular browser (manually).
We are using the Cypress for automated end-to-end testing.
When performing POST requests via Cypress (e.g., creating a role), we consistently receive a 400 Bad Request response from the backend API. However, the same operations succeed when done manually through the UI in a regular browser.
GET requests work fine through Cypress.
The issue only arises for POST/PUT operations (e.g., creating roles).
Screenshot and Cypress test snippet are attached for reference.
/// <reference types="cypress" />
import { Data } from "../../../fixtures/data.model";
describe('Administration > Security Management > Roles', { scrollBehavior: false }, () => { let data: Data; const baseUrl = Cypress.config().baseUrl; const testData = { role_name: "cypress role " + new Date().getTime(), role_sidebar_text: 'Roles', role_sidebar_url: '/identity-management/roles' } before(function () { cy.fixture("example").then((res) => { data = res; }); });
beforeEach(() => {
cy.visit({ url: baseUrl, failOnStatusCode: false });
cy.visit({ url: baseUrl, failOnStatusCode: false });
cy.contains("Login", { matchCase: false, timeout: 30000 })
.eq(0)
.should("exist")
.scrollIntoView()
.click({ force: true });
cy.wait(1000);
// Input creds
cy.get('[id="LoginInput_UserNameOrEmailAddress"]').type(data.username, { delay: 20 });
cy.get('[id="password-input"]').type(data.password, { delay: 20 });
cy.wait(1000);
cy.contains("Login", { matchCase: false, timeout: 30000 })
.eq(0)
.should("exist")
.scrollIntoView()
.click({ force: true });
cy.contains("Home", { matchCase: false, timeout: 30000 })
.eq(0)
.should("exist")
.scrollIntoView()
.click({ force: true });
cy.wait(1000);
cy.log("✅ Passed ")
});
after(() => {
// cy.clearLocalStorage();
// cy.clearCookies();
});
it("should create a role", () => {
const exactRegex = new RegExp(^${testData.role_sidebar_text}$, 'i');
cy.log("✅ Visiting -> " + exactRegex)
cy.contains(exactRegex, { matchCase: false, timeout: 30000 })
.should('exist')
.eq(0)
.scrollIntoView()
.click({ force: true });
cy.wait(1000);
cy.url().should('include', testData.role_sidebar_url);
cy.wait(1000);
// On role page
cy.contains("New role", { matchCase: false, timeout: 30000 })
.eq(0)
.should("exist")
.scrollIntoView()
.click({ force: true });
cy.get(".modal-content", { timeout: 20000 })
.contains("New role", { matchCase: false })
.should("exist")
.scrollIntoView()
cy.wait(2000)
cy.get('.modal-content', { timeout: 10000 })
.contains('label', 'Role name', { matchCase: false }) // find the label by text
.parent() // go to the parent of the label
.find('input') // find the input inside that parent
.first() // select the first input (if multiple)
.scrollIntoView()
.type(testData.role_name, { force: true });
cy.get(".modal-content", { timeout: 20000 })
.contains("Public", { matchCase: false })
.should("exist")
.scrollIntoView()
.click({ force: true });
const createRole = "createRole"
// cy.intercept("POST", "/api/identity/roles/").as(createRole);
cy.wait(1000)
cy.contains("Save", { matchCase: false, timeout: 30000 })
.eq(0)
.should("exist")
.scrollIntoView()
.click({ force: true });
// cy.wait("@" + createRole, { timeout: 60000 }).its("response.statusCode").should("eq", 200);
cy.wait(1000)
cy.log("❌ tests failing due to server's incorrect response")
})
it("should look for a role", () => {
const exactRegex = new RegExp(^${testData.role_sidebar_text}$, 'i');
cy.log("✅ Visiting -> " + exactRegex)
cy.contains(exactRegex, { matchCase: false, timeout: 30000 })
.should('exist')
.eq(0)
.scrollIntoView()
.click({ force: true });
cy.wait(1000);
cy.url().should('include', testData.role_sidebar_url);
cy.wait(1000);
const getRole = "getRole"
cy.intercept("GET", "/api/identity/roles**").as(getRole);
// On role page
cy.get('input[placeholder="Search"]')
.should('exist')
.eq(0)
.scrollIntoView()
.type('cypress', { force: true });
cy.wait("@" + getRole, { timeout: 60000 }).its("response.statusCode").should("eq", 200);
cy.get('[role="table"]')
.contains('cypress')
.eq(0)
.scrollIntoView()
.should('be.visible');
});
});
Could you please assist us in identifying what may be causing this issue specifically for Cypress and how to resolve it within the ABP framework setup (e.g., configuration changes, headers, etc.)?
Thank you in advance for your help!
Best regards, Tuniki Rishikesh AUMTECH
[maliming] said: hi
The latest 8.x version is 8.3.4
https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore/8.3.4
Your code seems to have no problem. You can run it. Feel free to provide feedback on any exceptions/problems.
Thanks.
hi, Thanks this solved my issue
Hi
Additionally, I’ve updated the DbContextFactory and EntityFrameworkCoreModule files to use .UseNTi(...) as per the Aumerial provider's documentation. Could you kindly confirm if these changes will work as expected, or if there’s anything else I need to adjust for full compatibility?
DbContextFactory
using System.IO; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using Aumerial.EntityFrameworkCore; // Check Aumerial's NuGet package
namespace NTIDemo.EntityFrameworkCore;
public class NTIDemoDbContextFactory : IDesignTimeDbContextFactory<NTIDemoDbContext> { public NTIDemoDbContext CreateDbContext(string[] args) { var configuration = BuildConfiguration();
NTIDemoEfCoreEntityExtensionMappings.Configure();
var builder = new DbContextOptionsBuilder<NTIDemoDbContext>()
.UseNTi(configuration.GetConnectionString("Default")); // Replace with Aumerial's method
return new NTIDemoDbContext(builder.Options);
}
private static IConfigurationRoot BuildConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../NTIDemo.DbMigrator/"))
.AddJsonFile("appsettings.json", optional: false);
return builder.Build();
}
}
EntityFrameworkCoreModule
using System; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Uow; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.BackgroundJobs.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity.EntityFrameworkCore; using Volo.Abp.OpenIddict.EntityFrameworkCore; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.BlobStoring.Database.EntityFrameworkCore; using Volo.Abp.LanguageManagement.EntityFrameworkCore; using Volo.FileManagement.EntityFrameworkCore; using Volo.Abp.TextTemplateManagement.EntityFrameworkCore; using Volo.Saas.EntityFrameworkCore; using Volo.Abp.Gdpr; using Volo.Chat.EntityFrameworkCore; using Volo.Abp.Studio; using Aumerial.EntityFrameworkCore; using Microsoft.Extensions.Configuration;
namespace NTIDemo.EntityFrameworkCore;
[DependsOn( typeof(NTIDemoDomainModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule), typeof(AbpSettingManagementEntityFrameworkCoreModule), typeof(AbpBackgroundJobsEntityFrameworkCoreModule), typeof(AbpAuditLoggingEntityFrameworkCoreModule), typeof(AbpFeatureManagementEntityFrameworkCoreModule), typeof(AbpIdentityProEntityFrameworkCoreModule), typeof(AbpOpenIddictProEntityFrameworkCoreModule), typeof(LanguageManagementEntityFrameworkCoreModule), typeof(FileManagementEntityFrameworkCoreModule), typeof(SaasEntityFrameworkCoreModule), typeof(ChatEntityFrameworkCoreModule), typeof(TextTemplateManagementEntityFrameworkCoreModule), typeof(AbpGdprEntityFrameworkCoreModule), typeof(BlobStoringDatabaseEntityFrameworkCoreModule) )] public class NTIDemoEntityFrameworkCoreModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { // https://www.npgsql.org/efcore/release-notes/6.0.html#opting-out-of-the-new-timestamp-mapping-logic
NTIDemoEfCoreEntityExtensionMappings.Configure();
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAbpDbContext<NTIDemoDbContext>(options =>
{
/* Remove "includeAllEntities: true" to create
* default repositories only for aggregate roots */
options.AddDefaultRepositories(includeAllEntities: true);
});
if (AbpStudioAnalyzeHelper.IsInAnalyzeMode)
{
return;
}
Configure<AbpDbContextOptions>(options =>
{
options.Configure<NTIDemoDbContext>(context =>
{
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
context.DbContextOptions.UseNTi(configuration.GetConnectionString("Default"));
});
});
}
}
Looking forward to your guidance.
Best regards, Rishikesh