Yes, you can add them.
Does your whitelist support keywords or subdomains?
Thanks.
hi
It would be easiest if you could add domain keywords or if it supported subdomains.
https://abp.io/ https://nuget.abp.io/ https://account.abp.io/
Thanks.
hi
You can add all abp.io and its subdomains.
Thanks.
hi
Can you build the project using the dotnet build command?
I think this is related to the VS version. maybe you can upgrade vs to latest version
Related to https://github.com/riok/mapperly/issues/2134
Thanks.
Hi,
The username field in the "Login with this tenant" modal is editable by design. It defaults to admin (configured via AbpAccountOptions.TenantAdminUserName), but any host user with the Saas.Tenants.Impersonation permission can change it to any tenant username. The TenantAdminUserName option only controls the default pre-filled value, not a restriction.
If you want to restrict which tenant users can be impersonated based on the current host user's role, you need to add server-side validation logic. Here's what you should override depending on your setup:
Create a custom class that inherits from ImpersonationExtensionGrant and override the ImpersonateTenantAsync method:
public class MyImpersonationExtensionGrant : ImpersonationExtensionGrant
{
protected override async Task<IActionResult> ImpersonateTenantAsync(
ExtensionGrantContext context,
ClaimsPrincipal principal,
Guid tenantId,
string tenantUserName)
{
// Add your custom validation logic here.
// For example, check the current user's role and restrict target username accordingly:
//
// var currentUserRoles = principal.FindAll(ClaimTypes.Role).Select(c => c.Value);
// if (!currentUserRoles.Contains("admin") && tenantUserName == "admin")
// {
// // Return forbidden or force a different username
// }
return await base.ImpersonateTenantAsync(context, principal, tenantId, tenantUserName);
}
}
Then register it in your AuthServer project's module class by replacing the grant in AbpOpenIddictExtensionGrantsOptions:
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpOpenIddictExtensionGrantsOptions>(options =>
{
options.Grants[ImpersonationExtensionGrant.ExtensionGrantName] = new MyImpersonationExtensionGrant();
});
}
Note:
ImpersonationExtensionGrantis not registered via dependency injection. It is instantiated directly and stored in theAbpOpenIddictExtensionGrantsOptions.Grantsdictionary, so you must replace it through Options configuration as shown above.
Override the OnPostAsync method in ImpersonateTenantModel:
[ExposeServices(typeof(ImpersonateTenantModel))]
public class MyImpersonateTenantModel : ImpersonateTenantModel
{
public MyImpersonateTenantModel(
IPermissionChecker permissionChecker,
ICurrentPrincipalAccessor currentPrincipalAccessor)
: base(permissionChecker, currentPrincipalAccessor)
{
}
public override async Task<IActionResult> OnPostAsync()
{
// Add your custom validation logic here before calling base.
return await base.OnPostAsync();
}
}
This class is located in the Volo.Abp.Account.Pro.Public.Web package.
Since you mentioned you're using a tiered solution, you should focus on the first approach — replacing ImpersonationExtensionGrant in your AuthServer project. The validation logic runs on the server side, so even if the user modifies the username in the UI, your restriction will still be enforced.
hi
Please apply the following temporary workaround:
Step 1 — Download the fixed proxy JSON file
Download the file from: https://limewire.com/d/WDygb#YCBWeHTvIo
Step 2 — Place the file in your project
Copy the downloaded cms-kit-pro-common-generate-proxy.json into your *.HttpApi.Client project under the ClientProxies folder:
YourProject.HttpApi.Client/
└── ClientProxies/
└── cms-kit-pro-common-generate-proxy.json
Step 3 — Ensure the file is embedded as a resource
Open your *.HttpApi.Client.csproj and make sure the following item group exists (add it if missing):
<ItemGroup>
<EmbeddedResource Include="**\*generate-proxy.json" />
<Content Remove="**\*generate-proxy.json" />
</ItemGroup>
Step 4 — Register the virtual file set override
Open your *HttpApiClientModule.cs and add the following inside ConfigureServices:
// Temporary workaround: override cms-kit-pro-common-generate-proxy.json embedded in the NuGet package.
// Remove this block once the fix is shipped in a new NuGet release.
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<YourProjectHttpApiClientModule>("YourCompanyName.YourProjectName");
});
Replace
YourProjectHttpApiClientModulewith your actual module class name, and"YourCompanyName.YourProjectName"with your actual root namespace (the<RootNamespace>value in your.csproj).
Step 5 — Rebuild and run
Rebuild the solution and run the application. The FAQ widget should now work correctly.
You can revert all of these changes once you upgrade to the version that includes the fix.
hi
https://github.com/maliming/source/invitations
hi
The EF Core provider for MySQL does not yet fully support .NET 10. We are currently waiting for them to add support.
see https://github.com/abpframework/abp/issues/24213
Thanks.
Thank you for the update.
To help narrow down whether this is an ABP Studio application issue or a .NET runtime networking issue on your machine, could you please run the following command in PowerShell?
[System.Net.Http.HttpClient]::new().GetStringAsync('https://account.abp.io/.well-known/openid-configuration').Result
Or
try {
$handler = [System.Net.Http.HttpClientHandler]::new()
$client = [System.Net.Http.HttpClient]::new($handler)
$client.Timeout = [TimeSpan]::FromSeconds(30)
Write-Host "=== .NET Runtime: $([System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription)"
Write-Host "=== OS: $([System.Runtime.InteropServices.RuntimeInformation]::OSDescription)"
Write-Host ""
Write-Host "Requesting https://account.abp.io/.well-known/openid-configuration ..."
$result = $client.GetStringAsync('https://account.abp.io/.well-known/openid-configuration').Result
Write-Host "SUCCESS - Response length: $($result.Length) characters" -ForegroundColor Green
Write-Host $result.Substring(0, [Math]::Min(200, $result.Length))
} catch {
Write-Host "FAILED" -ForegroundColor Red
Write-Host ""
Write-Host "=== Exception Type: $($_.Exception.GetType().FullName)"
Write-Host "=== Message: $($_.Exception.Message)"
$inner = $_.Exception.InnerException
$depth = 1
while ($inner -ne $null) {
Write-Host ""
Write-Host "=== InnerException ($depth): $($inner.GetType().FullName)"
Write-Host "=== Message: $($inner.Message)"
if ($inner -is [System.Net.Sockets.SocketException]) {
Write-Host "=== SocketErrorCode: $($inner.SocketErrorCode)"
Write-Host "=== NativeErrorCode: $($inner.NativeErrorCode)"
}
$inner = $inner.InnerException
$depth++
}
} finally {
if ($client) { $client.Dispose() }
}
Please share the result so we can determine the next steps.
Thanks.