Stop wrestling with Identity Server. Ship OAuth in minutes.
Two complementary tools: AuthnzNet (local OAuth server) + Noundry.Authnz (client library). Test locally, deploy anywhere.
Local OAuth Server + CLI
A full OAuth 2.0 / OpenID Connect server you run locally. Identity Server replacement for dev.
NuGet Client Library
A NuGet package that connects your app to any OAuth IdP - AuthnzNet locally, or Google/GitHub in prod.
Use both for local dev, then swap AuthnzNet for real providers in production. Your app code stays the same.
No API keys, works offline
Change config
Same code, real IdPs
// appsettings.Development.json
{
"OAuth": {
"Providers": {
"authnznet": {
"ClientId": "client_xxx",
"ClientSecret": "secret_yyy",
"Authority": "https://localhost:5000"
}
}
}
}
// appsettings.Production.json
{
"OAuth": {
"Providers": {
"google": {
"ClientId": "xxx.apps.googleusercontent.com",
"ClientSecret": "your-secret"
}
}
}
}
A local OAuth 2.0 server you control. Identity Server replacement for development.
Install the CLI
dotnet tool install -g Noundry.AuthnzNet.CLI
Create tenant, client, user
ndaz quickstart
Start the server
ndaz serve
# Output from ndaz quickstart:
OAuth Configuration +---------------+------------------------------+ | Authority | https://localhost:5000 | | Client ID | client_4d47e486494d4ab68 | | Client Secret | 1IHI0Wvw1cQQuEJAnsNciWR1 | +---------------+------------------------------+ Test User +----------+---------------+ | Email | dev@localhost | | Password | Password123! | +----------+---------------+
Authorization Code, Client Credentials, Password, Refresh Token
Multiple organizations, users, and clients with full isolation
Web UI at localhost:5000/dashboard or use the ndaz CLI
NuGet package to integrate ANY OAuth IdP into your .NET app. Works with AuthnzNet locally or real providers in production.
Install Package
dotnet add package Noundry.Authnz
Add Services
builder.Services.AddNoundryOAuth(config)
Use Middleware
app.UseNoundryOAuth()
using Noundry.Authnz.Extensions;
builder.Services.AddNoundryOAuth(config, options =>
{
options.OnOAuthSuccess = async ctx =>
{
// Create local user account
return OAuthSuccessResult.WithClaims(
new Claim("user_id", user.Id)
);
};
});
app.UseNoundryOAuth();
AuthnzNet
Local
Microsoft
GitHub
Apple
Custom
Create local user accounts after OAuth success. No boilerplate "OAuthSuccess" catch pages.
OnOAuthSuccess delegate
Simple inline handler in Program.cs
IOAuthSuccessHandler interface
Full DI support for complex scenarios
New/Returning User Detection
Different handlers for onboarding vs login
Custom Claims Injection
Add user_id, roles, permissions to cookie
Stop fighting with Identity Server. Test OAuth locally in 60 seconds.