In ABP 10.5, IdentityUser implements optimistic concurrency via IHasConcurrencyStamp. That means any update to the user aggregate (including LastSignInTime) participates in concurrency control. So if two /connect/token requests load the same IdentityUser row and both call UserManager.UpdateAsync(user), one of them can legitimately fail with AbpDbConcurrencyException because the first update changes the ConcurrencyStamp and the second update now affects 0 rows.
So: Yes, updating LastSignInTime can cause a concurrency failure under concurrent logins with the current behavior, even if the credentials are valid.
Whether this should fail the login is more of a product/behavior decision:
Practical options (server-side) to avoid rejecting a valid login because of this non-critical update:
AbpDbConcurrencyException only around the LastSignInTime update (i.e., keep issuing the token, treat timestamp update as best-effort).LastSignInTime again once (or a small retry count). (This preserves the audit field update without failing logins.)LastSignInTime to a separate table/entity (or update it with a direct SQL update that doesn’t use the concurrency stamp), so it doesn’t contend with user aggregate concurrency.Conceptually: the concurrency exception is correct for the aggregate update, but it’s reasonable to not fail the authentication flow just because LastSignInTime couldn’t be written due to a race.
Sources (verified):
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.
ABP-LIC-0017 in this scenario typically happens because the value you put into AbpLicenseCode is not the correct license code format.
The API Key you see under Profile → My Organizations on abp.io is mainly for NuGet feed access / tooling, and it is not the same thing as the runtime application license code expected by AbpLicenseCode.
In an ABP Commercial module solution (like Volo.Chat), the license check is performed during:
await app.InitializeApplicationAsync();
so the app stops there when license validation fails.
AbpLicenseCode
Volo.Chat.Blazor.Server.Host/appsettings.json (or wherever you set it), remove/replace:{
"AbpLicenseCode": "<<<YOUR API KEY>>>"
}
Use the real ABP Commercial License Code
AbpLicenseCode (as a single line, no extra spaces/newlines).If you don’t have that license code / your license doesn’t include Volo.Chat
Recommended: don’t store it in appsettings.json
AbpLicenseCode<your real ABP license code>If you still get ABP-LIC-0017 after using the correct license code
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.
Create your own domain entity to represent an attachment linked to a chat message (or linked to a chat “conversation + messageId”):
IdChatMessageId (or ConversationId + MessageId depending on your integration point)FileName, MimeType, SizeBlobName / BlobId (where the binary is stored)CreatorId, CreationTimeStore the binary using ABP’s standard streaming upload style:
IRemoteStreamContent and saves the stream (file) into your storage (blob storage, file system, database—depending on your setup).IRemoteStreamContent.Extend the chat send message workflow
attachmentId or fileId)Screenshots (print screen) in React
File objectDisplay attachments in the message window
Yes, this is possible and is a common pattern in ABP projects. You generally implement:
A “document/attachment” entity (e.g., CompanyDocument) with:
CompanyIdFileName, MimeType, SizeBlobId/BlobName (or a reference to File Management module object if you choose)Upload endpoint (Application Service) using IRemoteStreamContent:
CompanyDocument row linked to CompanyId.List / download / delete endpoints:
GetCompanyDocuments(companyId)Download(documentId) returning IRemoteStreamContentDelete(documentId)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.
[DynamicPropertyUnique] is an ABP Low-Code attribute used on dynamic entity properties to indicate that the value must be unique across all records for that entity. Example from the Low-Code docs:[DynamicPropertyUnique]
public string ProductCode { get; set; }
ABP Suite currently doesn’t generate/configure uniqueness for properties (i.e., it doesn’t have a “unique” option you can tick in the entity designer). This matches an existing ABP support answer: Suite doesn’t have this feature; you need to enforce uniqueness yourself (e.g., check before insert/update and throw a BusinessException, and/or add a unique index at the database level).
About your suggestion (“integrate support for unique properties into ABP Suite”): this is a product/feature request for ABP Suite. The current workaround is:
BusinessException) to return a user-friendly message.Sources (validated):
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.
.input-group (this fixes both the extra 1rem height and the lost flex sizing caused by .custom-select-wrapper becoming the flex item):/* LeptonX 5.3+ FormSelect inside Bootstrap input-group fix */
.input-group > .custom-select-wrapper {
flex: 1 1 auto;
width: 1%;
min-width: 0;
/* prevent the wrapper's default spacing from increasing the flex row height */
margin-bottom: 0;
}
/* optional: make the display fill the wrapper */
.input-group > .custom-select-wrapper > .custom-select-display {
width: 100%;
}
form-select-sm / form-select-lg, add explicit sizing rules for the generated display (because LeptonX hides the native <select> and the size classes don’t affect the visible element):/* propagate Bootstrap select sizing to LeptonX display */
.custom-select-wrapper > select.form-select-sm + .custom-select-display {
padding-top: .25rem;
padding-bottom: .25rem;
font-size: .875rem;
}
.custom-select-wrapper > select.form-select-lg + .custom-select-display {
padding-top: .5rem;
padding-bottom: .5rem;
font-size: 1.25rem;
}
style="max-width: 92px" applied on the native <select>, CSS alone can’t reliably “copy” inline styles to the generated .custom-select-display. In that case the only deterministic workaround is what you already discovered: restore the native select (or write a tiny JS hook that copies computed width/max-width from the <select> to .custom-select-display after LeptonX initializes).No verified source available for this specific .input-group + FormSelect wrapper issue/fix (it’s a theme CSS gap), but the override approach is consistent with ABP’s recommended UI overriding mechanism.
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.
In ABP 10.5.0, the Admin Console SPA is shipped as pre-built static assets (embedded via the Virtual File System and served by AdminConsoleSpaMiddleware) and is hosted under /admin-console/*. Because the shipped index.html contains root-absolute URLs (e.g. href="/admin-console/...", src="/admin-console/...") they won’t automatically include Request.PathBase when your app is hosted under a sub-path (IIS virtual application, reverse proxy path prefix, app.UsePathBase("/sub"), etc.). Your analysis of the failure mode is correct.
There is no runtime option in AbpAdminConsoleOptions to set a base path / path base, so you cannot fix this purely with configuration.
Practical workaround (server-side, non-invasive to the NuGet package): keep your response-rewriting (or equivalent) but do it in a way that is tightly scoped and resilient:
index.html), not all responses.<base href="/admin-console/"> to <base href="{Request.PathBase}/admin-console/">href="/admin-console/... / src="/admin-console/... to be prefixed with Request.PathBasePathBase value (usually there’s only one in a deployment).This is the only host-level workaround that keeps using the packaged SPA as-is.
If you can change deployment topology: the other workaround is to ensure the reverse proxy/IIS doesn’t mount the app under a PathBase (i.e., make the app the site root), but you already explained why that’s often not possible.
Suggested product fix (what you proposed is aligned with the underlying issue):
AdminConsoleSpaMiddleware inject PathBase at response time (e.g., placeholder token replacement for the <base href> and/or asset URLs).No verified source available that documents a built-in setting or officially supported approach for hosting the embedded Admin Console under a non-root PathBase in 10.5.x.
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.
IdentityUser (i.e., Volo.Abp.Identity.IdentityUser). That usually ends up with a compile/migration failure during “DB migration step” (Suite runs dotnet build and then applies EF Core migrations).Guid (e.g., CreatorUserId, MaintenanceIndividualId, etc.) in your aggregate/entity, and (optionally) let Suite use a DTO type for the UI lookup/display, instead of using IdentityUser as a domain navigation target.IdentityUser.cs as the navigation target in ABP Suite.public Guid? MaintenanceIndividualId { get; set; }
AppUser/AppUserDto if your solution has it) as described in the article below.AppUser) and its corresponding DTO (commonly AppUserDto / or an IdentityUserDto-derived DTO if needed), and choose Name as display property.This is exactly the recommended workaround: Suite needs a DTO for the target to generate lookup/display correctly; directly targeting IdentityUser often breaks generation/build.
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.
Update ABP Studio to the latest version (some macOS-specific startup issues have been fixed in later releases). The safest path is:
Check ABP Studio logs to see the exact reason it exits:
~/.abp/studio/ui/logsIf you still can’t resolve it after updating + fixing NuGet feeds, contact support and include the latest log file content from ~/.abp/studio/ui/logs:
Links:
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.
Okta setup in ABP
AddOpenIdConnect(...) (Okta is just an OIDC provider, so the same setup approach used for Azure AD applies).What to do with “Enable two factor authentication” on the Users page after enabling Okta?
What should be configured under the “Application” page (OpenIddict applications) shown in your screenshot?
https://<your-host>/signin-oidchttps://<your-host>/signout-callback-oidcSources:
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.
DotnetToolSettings.xml was not found in the package error is almost always caused by a corrupted/incomplete NuGet package in your local cache (so dotnet tool downloads/uses a broken copy and then fails to find the settings file inside it).Do the following in order:
dotnet tool uninstall -g Volo.Abp.Studio.Cli
dotnet nuget locals all --clear
dotnet tool install -g Volo.Abp.Studio.Cli
NuGet.Config doesn’t prioritize an internal feed that returns broken content or blocks nuget.org. After fixing feeds, repeat steps (2) and (3).Sources:
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.