A suite of NuGet packages for building multi-tenant Blazor applications with team management, authorization, and API infrastructure.
| Package | Description | WASM-safe |
|---|---|---|
| Tharga.Team | Domain models, authorization primitives, service abstractions | Yes |
| Tharga.Blazor | Generic Blazor UI components (buttons, breadcrumbs, etc.) | Yes |
| Tharga.Team.Blazor | Team management Blazor components | Yes |
| Tharga.Team.MongoDB | MongoDB persistence for teams and users | No |
| Tharga.Team.Service | Server-side API key auth, Swagger, audit logging | No |
Tharga.Team ── plain .NET, no external dependencies
├── Tharga.Blazor ── generic Blazor UI components
│ └── Tharga.Team.Blazor ── team management UI
│ └── + Tharga.Team.Service
├── Tharga.Team.MongoDB ── persistence layer
│ └── + Tharga.MongoDB
└── Tharga.Team.Service ── server-side API + auth
└── + Tharga.MongoDB, ASP.NET Core
Install the packages:
dotnet add package Tharga.Team.Blazor
dotnet add package Tharga.Team.Service
dotnet add package Tharga.Team.MongoDB
Register everything in Program.cs:
// One call to set up auth, Blazor, controllers, API keys
builder.AddThargaPlatform(o =>
{
o.Blazor.Title = "My App";
o.Blazor.RegisterTeamService<MyTeamService, MyUserService>();
});
// MongoDB persistence (requires consumer-specific entity types)
builder.Services.AddMongoDB(o => { /* connection config */ });
builder.Services.AddThargaTeamRepository(o =>
{
o.UseUserEntity<MyUserEntity>();
o.UseTeamEntity<MyTeamEntity, MyTeamMember>();
});
var app = builder.Build();
app.UseThargaPlatform();Add to appsettings.json:
{
"AzureAd": {
"Authority": "https://your-tenant.ciamlogin.com/your-tenant-id",
"ClientId": "your-client-id",
"TenantId": "your-tenant-id",
"CallbackPath": "/signin-oidc"
}
}Optional features (pass via ThargaPlatformOptions):
builder.AddThargaPlatform(o =>
{
// Fine-grained scopes
o.ConfigureScopes = scopes =>
{
scopes.Register("orders:read", AccessLevel.Viewer);
scopes.Register("orders:write", AccessLevel.Administrator);
};
// Named roles that bundle scopes
o.ConfigureTenantRoles = roles =>
{
roles.Register("Editor", new[] { "orders:read", "orders:write" });
};
// Audit logging
o.Audit = new AuditOptions { StorageMode = AuditStorageMode.MongoDB };
});Individual Add* methods remain available for partial/custom setups. See the Implementation Guide for step-by-step instructions.