identityserver-usermanagement
Configures user management and authentication flows for Duende IdentityServer, prioritizing passwordless methods.
Install
mkdir -p .claude/skills/identityserver-usermanagement && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/11539" && unzip -o skill.zip -d .claude/skills/identityserver-usermanagement && rm skill.zipInstalls to .claude/skills/identityserver-usermanagement
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Setting up Duende User Management with IdentityServer: passwordless authentication (OTP, TOTP, passkeys), storage configuration, user lifecycle, and migration from ASP.NET Identity.Key capabilities
- →Add user management to Duende IdentityServer projects
- →Set up passwordless authentication (OTP, TOTP, passkeys)
- →Configure storage providers (PostgreSQL, SQL Server, SQLite)
- →Integrate User Management with IdentityServer for claims delivery
- →Manage user profiles, roles, and groups
- →Migrate users from ASP.NET Identity
How it works
The skill integrates Duende User Management into IdentityServer by adding necessary NuGet packages and configuring services in `Program.cs` for passwordless authentication, storage, and claims mapping.
Inputs & outputs
When to use identityserver-usermanagement
- →Implementing passwordless login flows
- →Migrating existing users from ASP.NET Identity
- →Configuring PostgreSQL or SQL Server for IdentityServer
- →Setting up user roles and profile management
About this skill
User Management
When to Use This Skill
- Adding user management to a Duende IdentityServer project
- Setting up passwordless authentication (OTP, TOTP, passkeys)
- Configuring storage providers (PostgreSQL, SQL Server, SQLite)
- Integrating User Management with IdentityServer for claims and login/logout
- Managing user profiles, roles, and groups
- Migrating users from ASP.NET Identity
Core Principles
- Duende User Management is passwordless-first — OTP email/SMS is the default flow
- Requires
Duende.UserManagement.IdentityServer8NuGet package + .NET 10 - Storage is document-based (no EF migrations needed) — schema auto-creates at startup
- Configuration goes inside
AddUserManagement(), not at top level - Use
app.UseIdentityServer()(notUseAuthentication()separately)
Docs: https://docs.duendesoftware.com/identityserver/usermanagement
Setup
1. Add Packages
dotnet add package Duende.IdentityServer
dotnet add package Duende.UserManagement.IdentityServer8
dotnet add package Duende.Storage.Sqlite # or .PostgreSQL, .Mssql
2. Configure Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddIdentityServer(options =>
{
options.UserInteraction.LoginUrl = "/Account/Login";
options.UserInteraction.LogoutUrl = "/Account/Logout";
})
.AddInMemoryClients(Config.Clients)
.AddInMemoryIdentityResources(Config.IdentityResources)
.AddUserManagement(options =>
{
// Storage (pick one)
options.AddSqliteStore("Data Source=users.db");
// options.AddPostgreSqlStore(connectionString);
// options.AddSqlServerStore(connectionString);
// OTP delivery
options.UseSmtpOtpDispatcher(smtp =>
builder.Configuration.GetSection("Smtp").Bind(smtp));
});
var app = builder.Build();
// Auto-create database schema
var schema = app.Services.GetRequiredService<IDatabaseSchema>();
await schema.CreateIfNotExistsAsync();
app.UseIdentityServer();
app.MapRazorPages();
app.Run();
3. OTP Dispatcher
Console (development):
builder.Services.AddSingleton<IOtpDispatcher, ConsoleOtpDispatcher>();
SMTP (production):
options.UseSmtpOtpDispatcher(x =>
{
x.Host = "smtp.example.com";
x.Port = 587;
x.Username = "[email protected]";
x.Password = "secret";
x.FromAddress = "[email protected]";
});
Authentication Methods
| Method | Description | Setup |
|---|---|---|
| OTP (default) | One-time codes via email/SMS | IOtpDispatcher implementation |
| TOTP | Authenticator apps (RFC 6238) | Built-in, user enrollment required |
| Passkeys | WebAuthn/FIDO2 phishing-resistant | Built-in, browser support required |
| Passwords | Traditional username/password (PBKDF2) | Opt-in, not recommended as primary |
| External | OAuth 2.0 / OIDC federated login | Standard ASP.NET Core auth handlers |
| Recovery codes | Single-use backup codes | Auto-generated during 2FA setup |
IdentityServer Integration
AddUserManagement() is called on the IdentityServer builder — it automatically:
- Registers
IProfileServicefor claims delivery - Handles login/logout flows
- Maps user attributes to identity token claims
Claims Mapping
User profile attributes are mapped to claims based on requested scopes:
openid→subprofile→name,given_name,family_name, etc.email→email,email_verified
Custom attributes are available through custom identity resources.
Storage
| Provider | Package | Connection |
|---|---|---|
| SQLite | Duende.Storage.Sqlite | Data Source=users.db |
| PostgreSQL | Duende.Storage.PostgreSQL | Standard connection string |
| SQL Server | Duende.Storage.Mssql | Standard connection string |
| In-Memory | (built-in) | Data Source=:memory: (testing only) |
Storage is document-based — no EF Core migrations needed. Call IDatabaseSchema.CreateIfNotExistsAsync() at startup to ensure schema exists.
User Lifecycle
- Creation: Users are created on first authentication (passwordless) or via admin APIs
- Profiles: Custom attributes stored as key-value pairs, organized in attribute groups
- Roles & Groups: RBAC support with group membership and role inheritance
- Deletion: Full user deletion with cascade
Migration from ASP.NET Identity
options.AddAspNetIdentityMigration(migrationOptions =>
{
migrationOptions.ConnectionString = "existing-aspnet-identity-db";
});
Key points:
- Imports users, roles, and claims from existing ASP.NET Identity tables
- Password hashes are preserved (users can still log in with existing passwords)
- Migration runs once; subsequent runs skip already-imported users
- After migration, users can enroll in passwordless methods
Common Anti-Patterns
❌ Configuring storage outside AddUserManagement() — storage config must be inside the options lambda
❌ Using UseAuthentication() instead of UseIdentityServer() — IdentityServer middleware handles auth
❌ Skipping CreateIfNotExistsAsync() — database tables won't exist on first run
❌ Using in-memory storage in production — data is lost on restart
Common Pitfalls
- Storage configuration location:
AddSqliteStore()/AddPostgreSqlStore()must be called inside theAddUserManagement(options => { })lambda, not on the top-level builder. - .NET 10 required: User Management requires .NET 10 SDK or later.
- OTP dispatcher required: Without an
IOtpDispatcher, the default OTP flow cannot send codes. RegisterConsoleOtpDispatcherfor development. - LoginUrl/LogoutUrl: Must be set in IdentityServer options to point to your account pages.
- Schema creation: Call
IDatabaseSchema.CreateIfNotExistsAsync()before the app starts handling requests.
Related Skills
identityserver-configuration— IdentityServer host configuration and optionsidentityserver-ui-flows— Login/logout UI flowsidentityserver-upgrade-v7-to-v8— Migration guide for v8 (includes User Management as new feature)aspnetcore-authentication— ASP.NET Core authentication fundamentals
When not to use it
- →When configuring storage outside `AddUserManagement()`
- →When using `UseAuthentication()` instead of `UseIdentityServer()`
- →When skipping `CreateIfNotExistsAsync()` for database schema creation
Limitations
- →The skill requires `Duende.UserManagement.IdentityServer8` NuGet package + .NET 10.
- →Storage configuration must be inside `AddUserManagement()` options.
- →The skill requires `app.UseIdentityServer()` for middleware.
How it compares
This skill provides a structured approach to integrating passwordless-first user management into Duende IdentityServer, simplifying complex configurations and migrations compared to manual setup.
Compared to similar skills
identityserver-usermanagement side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| identityserver-usermanagement (this skill) | 0 | 2mo | Review | Intermediate |
| azure-identity-dotnet | 1 | 3mo | Review | Beginner |
| azure-security-keyvault-keys-dotnet | 1 | 3mo | Review | Intermediate |
| csharp-developer | 43 | 2mo | No flags | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
azure-identity-dotnet
microsoft
Azure Identity SDK for .NET. Authentication library for Azure SDK clients using Microsoft Entra ID. Use for DefaultAzureCredential, managed identity, service principals, and developer credentials. Triggers: "Azure Identity", "DefaultAzureCredential", "ManagedIdentityCredential", "ClientSecretCredential", "authentication .NET", "Azure auth", "credential chain".
azure-security-keyvault-keys-dotnet
microsoft
Azure Key Vault Keys SDK for .NET. Client library for managing cryptographic keys in Azure Key Vault and Managed HSM. Use for key creation, rotation, encryption, decryption, signing, and verification. Triggers: "Key Vault keys", "KeyClient", "CryptographyClient", "RSA key", "EC key", "encrypt decrypt .NET", "key rotation", "HSM".
csharp-developer
zenobi-us
Expert C# developer specializing in modern .NET development, ASP.NET Core, and cloud-native applications. Masters C# 12 features, Blazor, and cross-platform development with emphasis on performance and clean architecture.
csharp-pro
sickn33
Write modern C# code with advanced features like records, pattern matching, and async/await. Optimizes .NET applications, implements enterprise patterns, and ensures comprehensive testing. Use PROACTIVELY for C# refactoring, performance optimization, or complex .NET solutions.
microsoft-code-reference
github
Look up Microsoft API references, find working code samples, and verify SDK code is correct. Use when working with Azure SDKs, .NET libraries, or Microsoft APIs—to find the right method, check parameters, get working examples, or troubleshoot errors. Catches hallucinated methods, wrong signatures, and deprecated patterns by querying official docs.
dotnet-architect
sickn33
Expert .NET backend architect specializing in C#, ASP.NET Core, Entity Framework, Dapper, and enterprise application patterns. Masters async/await, dependency injection, caching strategies, and performance optimization. Use PROACTIVELY for .NET API development, code review, or architecture decisions.