VisuAuth 0.2.0
See the version list below for details.
dotnet add package VisuAuth --version 0.2.0
NuGet\Install-Package VisuAuth -Version 0.2.0
<PackageReference Include="VisuAuth" Version="0.2.0" />
<PackageVersion Include="VisuAuth" Version="0.2.0" />
<PackageReference Include="VisuAuth" />
paket add VisuAuth --version 0.2.0
#r "nuget: VisuAuth, 0.2.0"
#:package VisuAuth@0.2.0
#addin nuget:?package=VisuAuth&version=0.2.0
#tool nuget:?package=VisuAuth&version=0.2.0
<div align="center">
VisuAuth
The visual admin for ASP.NET Core Identity.
Drop-in admin dashboard, multi-tenancy, and themeable end-user auth pages — without forcing you to rebuild what the framework should ship with.
</div>
🚀 v0.1.0 is live on NuGet. First feature release — admin UI, end-user pages, multi-tenancy, the four theming layers, and the mobile JWT / WebView channel. Install via
dotnet add package VisuAuth. Pre-1.0, breaking changes can land on any0.xbump and will always be flagged in the CHANGELOG.
What it is
VisuAuth fills the gap that ASP.NET Core Identity leaves: it ships a complete admin UI for users/roles/claims, a multi-tenancy layer with per-tenant isolation, and themeable end-user authentication pages — all drop-in via two lines of code, the same way Hangfire ships its dashboard.
// Two-line drop-in — the form recommended for most consumers.
builder.Services.AddVisuAuth<ApplicationUser>();
app.MapVisuAuth();
Need finer control? The same call has a fluent form so you can pick the surfaces you want:
builder.Services.AddVisuAuth()
.UseAspNetIdentity<ApplicationUser>()
.AddAdminUi()
.AddEndUserUi();
Either way, navigate to /visuauth/admin for the dashboard and
/visuauth/login for the login page. A complete sample, including the
EF Core / Identity wiring this snippet leaves out, lives in
samples/Sample.WebApp.
What it gives you
🖥️ Admin UI (/visuauth/admin)
- List, search, filter users with pagination
- Create, edit, lock, unlock, delete users
- Reset password, force logout, reset 2FA
- Manage roles and claims
- Per-tenant scoped views
🌐 End-user UI
/visuauth/login— email + password/visuauth/register— self-service signup (configurable)/visuauth/forgot-password&/visuauth/reset-password/visuauth/confirm-email/visuauth/logout/visuauth/two-factor— coming in v0.2/visuauth/profile— account self-management, coming in v0.3
🏢 Multi-tenancy
TenantIdcolumn onAspNetUsers(and friends)- Global query filter applied automatically
- Tenant resolution via HTTP header (
X-Tenant-Id) or cookie set by the admin sidebar switcher (subdomain and JWT-claim resolvers planned for v0.2) - Per-tenant branding via the theming layers below (per-tenant password policy / lockout planned for v0.2)
🎨 Theming
- Layer 1: Override CSS variables — colors, fonts, logo, radius
- Layer 2: Programmatic config via
VisuAuthTheme - Layer 3: Razor view override for granular control
- Layer 4: Per-tenant theme resolved at runtime
📱 Mobile-ready
- REST API at
/visuauth/api/authwith JWT (HS256) issuance - WebView flow with deep-link callback for native apps
🔌 Pluggable backend
- v0.1: ASP.NET Core Identity
- v0.2: Microsoft Entra ID (admin UI via Microsoft Graph)
- v0.3: Microsoft Entra External ID
Abstractions (IUserStore, IRoleStore, IAuthenticationFlow, UserBackendCapabilities) are shaped from day 1 so adapters plug in cleanly.
Why VisuAuth exists
ASP.NET Core Identity gives you UserManager<T>, hashing, lockout, and token providers — but no admin UI, no multi-tenancy, no professional end-user pages. Every team rebuilds the same fragments, badly, under deadline pressure.
VisuAuth is to Identity what Hangfire is to background jobs: it adds the dashboard and operational surface that the framework should have shipped with.
Stack
| Runtime | .NET 10 |
| Web | ASP.NET Core Razor Pages |
| Frontend | htmx (no JS framework, no build step on the consumer side) |
| Identity | ASP.NET Core Identity (v0.1); Microsoft Entra ID / External ID (v0.2+) |
| Storage | EF Core (SQL Server, PostgreSQL, SQLite) |
| Mobile | REST API + JWT (HS256) |
| i18n | pt-BR, en (more on request) |
| License | Apache 2.0 |
Roadmap
| Version | Scope | Status |
|---|---|---|
| 0.0.1-alpha | Placeholder, name reserved | ✅ Released |
| 0.1 | Admin UI + End-user UI + Multi-tenancy + Theming + Mobile | ✅ Released |
| 0.2 | Microsoft Entra ID adapter, TOTP, external login providers, audit log | 🚧 In development |
| 0.3 | Entra External ID adapter, profile / sessions management, bulk operations | 📋 Planned |
| 1.0 | Production-ready, stable contracts | 📋 Planned |
Repository structure
visuauth/
├── src/
│ ├── VisuAuth/ # Meta-package
│ ├── VisuAuth.Abstractions/ # IUserStore, capabilities, contracts
│ ├── VisuAuth.Identity/ # ASP.NET Identity adapter
│ ├── VisuAuth.Entra/ # Microsoft Entra ID adapter — see its own README
│ ├── VisuAuth.AdminUi/ # Admin dashboard
│ └── VisuAuth.EndUserUi/ # Login, register, password reset, etc.
├── tests/
├── samples/
│ ├── Sample.WebApp/ # Drop-in example (Identity + Entra toggle)
│ └── Sample.EntraWebApp/ # Minimal Entra-only reference
└── docs/ # (Docusaurus, coming soon)
Getting started
VisuAuth assumes a project that already has ASP.NET Core Identity + EF Core
configured. The reference setup lives in
samples/Sample.WebApp; the section below is the
quickest path from an empty project to a working /visuauth/admin.
1. Install
dotnet add package VisuAuth
That meta-package pulls in VisuAuth.Abstractions, VisuAuth.Identity,
VisuAuth.AdminUi, and VisuAuth.EndUserUi as transitive dependencies.
Need only a subset? Install the individual VisuAuth.* packages instead.
2. Identity user, DbContext, migrations
Define an Identity user and the DbContext that owns it. The single-tenant
form is fine for v0.1 even if you plan to opt into multi-tenancy later —
swap IdentityUser for MultiTenantIdentityUser and
IdentityDbContext<TUser> for MultiTenantIdentityDbContext<TUser> when
you do.
public sealed class ApplicationUser : IdentityUser { }
public sealed class AppDbContext(DbContextOptions<AppDbContext> options)
: IdentityDbContext<ApplicationUser>(options);
Run dotnet ef migrations add Initial && dotnet ef database update
(or your equivalent) to create the AspNet* tables. VisuAuth does not
add tables of its own in v0.1.
3. Wire VisuAuth in Program.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using VisuAuth;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlite(builder.Configuration.GetConnectionString("Default")));
builder.Services
.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
// Two-line drop-in — registers Identity adapter + admin UI + end-user UI.
builder.Services.AddVisuAuth<ApplicationUser>();
var app = builder.Build();
app.UseStaticFiles(); // serves /_content/VisuAuth.AdminUi/visuauth.css etc.
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapVisuAuth();
app.Run();
4. Try it
/visuauth/admin— the dashboard. Restrict it with your own authorization policy ([Authorize(Roles = "Admin")]on a custom layout filter, an endpoint convention, etc.) before going to production — VisuAuth does not impose one in v0.1./visuauth/login— the public sign-in page./visuauth/register,/visuauth/forgot-password,/visuauth/reset-password,/visuauth/confirm-email.
For multi-tenancy, mobile JWT issuance, theming (CSS variables, programmatic
VisuAuthTheme, view overrides, per-tenant resolvers), and the i18n
pipeline, see
samples/Sample.WebApp/Program.cs — it
exercises every public surface.
Building & packaging
The repo packs five NuGet artefacts in one go:
VisuAuth, VisuAuth.Abstractions, VisuAuth.Identity, VisuAuth.AdminUi, VisuAuth.EndUserUi.
Every package shares the same version, sourced from a single
<VersionPrefix> in Directory.Build.props.
Local build
# Restore, build, test, all at once.
dotnet build src/VisuAuth.slnx --configuration Release
dotnet test src/VisuAuth.slnx --configuration Release
Local pack (smoke-test a new package without publishing)
# Pre-release with a local marker — never collides with anything on NuGet.org.
dotnet pack src/VisuAuth.slnx \
--configuration Release \
--output ./artifacts
# → ./artifacts/VisuAuth.0.1.0-alpha.local.nupkg (and the four sibling packages)
Override the suffix to mimic a CI build locally:
dotnet pack src/VisuAuth.slnx -c Release -o ./artifacts \
-p:VersionSuffix=alpha.999
# → VisuAuth.0.1.0-alpha.999.nupkg
Override the full version to mimic a stable release:
dotnet pack src/VisuAuth.slnx -c Release -o ./artifacts \
-p:Version=0.2.0 -p:VersionSuffix=
# → VisuAuth.0.2.0.nupkg
Publish channels
Two release channels run off the same GitHub Actions workflow
(.github/workflows/release.yml):
| Trigger | Version | NuGet visibility | How to consume |
|---|---|---|---|
Push to main (every merge) |
0.1.0-alpha.<run_number> |
Pre-release (hidden by default) | dotnet add package VisuAuth --prerelease |
Git tag matching v* (e.g. v0.1.0) |
0.1.0 (stable) |
Stable, shows as "Latest" | dotnet add package VisuAuth |
Manual workflow_dispatch |
Same as push-to-main | Pre-release | — |
The version comes from Directory.Build.props's <VersionPrefix> plus a
suffix computed by the workflow:
- On
main:-p:VersionSuffix=alpha.${{ github.run_number }}— monotonic across the repo lifetime, so0.1.0-alpha.42<0.1.0-alpha.43. - On tag: the tag name (minus the leading
v) becomes the full version via-p:Version=....
Both flows run restore → build → test → pack → push. The push step uses
dotnet nuget push --skip-duplicate, so a re-run never fails on a package
that already exists.
Cutting a stable release
- Bump
<VersionPrefix>inDirectory.Build.propsif needed (e.g. starting work on0.2.x). - Land the release commit on
main. - Tag and push:
git tag v0.2.0 git push origin v0.2.0 - The Release workflow detects
refs/tags/v0.2.0, buildsVisuAuth.0.2.0.nupkg(no suffix), and publishes to nuget.org.
Repository secrets
| Secret | Used by | How to set |
|---|---|---|
NUGET_API_KEY |
Release workflow (dotnet nuget push) |
Generate a key on nuget.org/account/apikeys with scope Push new packages and package versions for VisuAuth*, then add it under Settings → Secrets and variables → Actions as a repository secret. |
No other secrets are required — source-link metadata and license expression
are embedded at build time from Directory.Build.props.
Contributing
Issues, discussions, and PRs welcome. See CONTRIBUTING.md.
License
Apache License 2.0. Copyright © 2026 Thiago Luga and VisuAuth contributors.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.AspNetCore.Authentication.JwtBearer (>= 10.0.0)
- Microsoft.AspNetCore.Identity.EntityFrameworkCore (>= 10.0.0)
- Microsoft.EntityFrameworkCore (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.7)
- My.Extensions.Localization.Json (>= 4.0.0)
- QRCoder (>= 1.6.0)
- System.IdentityModel.Tokens.Jwt (>= 8.18.0)
- VisuAuth.Abstractions (>= 0.2.0)
- VisuAuth.AdminUi (>= 0.2.0)
- VisuAuth.EndUserUi (>= 0.2.0)
- VisuAuth.Identity (>= 0.2.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.3.0-alpha.43 | 36 | 5/30/2026 |
| 0.3.0-alpha.42 | 37 | 5/30/2026 |
| 0.3.0-alpha.41 | 38 | 5/29/2026 |
| 0.3.0-alpha.40 | 28 | 5/29/2026 |
| 0.3.0-alpha.39 | 37 | 5/29/2026 |
| 0.2.0 | 41 | 5/29/2026 |
| 0.2.0-alpha.37 | 44 | 5/29/2026 |
| 0.2.0-alpha.36 | 48 | 5/29/2026 |
| 0.2.0-alpha.35 | 42 | 5/28/2026 |
| 0.2.0-alpha.34 | 39 | 5/28/2026 |
| 0.2.0-alpha.33 | 37 | 5/28/2026 |
| 0.2.0-alpha.32 | 40 | 5/28/2026 |
| 0.2.0-alpha.31 | 47 | 5/28/2026 |
| 0.2.0-alpha.30 | 46 | 5/28/2026 |
| 0.2.0-alpha.29 | 36 | 5/28/2026 |
| 0.2.0-alpha.28 | 35 | 5/28/2026 |
| 0.2.0-alpha.27 | 34 | 5/28/2026 |
| 0.2.0-alpha.26 | 43 | 5/27/2026 |
| 0.2.0-alpha.25 | 37 | 5/26/2026 |
| 0.2.0-alpha.24 | 38 | 5/26/2026 |
See https://github.com/VisuAuth/visuauth/blob/main/CHANGELOG.md for release notes.