Audis.Authentication
2.0.0
dotnet add package Audis.Authentication --version 2.0.0
NuGet\Install-Package Audis.Authentication -Version 2.0.0
<PackageReference Include="Audis.Authentication" Version="2.0.0" />
<PackageVersion Include="Audis.Authentication" Version="2.0.0" />
<PackageReference Include="Audis.Authentication" />
paket add Audis.Authentication --version 2.0.0
#r "nuget: Audis.Authentication, 2.0.0"
#:package Audis.Authentication@2.0.0
#addin nuget:?package=Audis.Authentication&version=2.0.0
#tool nuget:?package=Audis.Authentication&version=2.0.0
Audis.Authentication
Gemeinsame Authentifizierung für das AUDIS-Ökosystem (AUDIS, Trust, Storage, Adapter, Analyzer, ...): Policies mit Modus Disabled/Audit/Enforce, X-Api-Key-Mechanismus, Erweiterungspunkt für weitere Mechanismen (z.B. Audis.Authentication.Hmac, Audis.Authentication.Jwt) und Authentifizierung ausgehender Requests über HttpClient.
Verwendung
Der Code legt nur fest, was geschützt wird (Policy). Welche Mechanismen eine Policy erfüllen und in welchem Modus sie läuft, steht in der Konfiguration. Policies ohne Konfiguration sind Disabled, das Verhalten der Anwendung bleibt dann unverändert.
| Modus | Verhalten |
|---|---|
Disabled (Default) |
Es wird keine AUDIS-Authentifizierung versucht, der Endpunkt verhält sich wie ohne AUDIS-Policy: Eine FallbackPolicy der Anwendung gilt weiterhin, ohne FallbackPolicy läuft der Request unverändert durch. |
Audit |
Credentials werden geprüft. Fehlende oder ungültige Credentials werden als Warnung geloggt (Policy, Pfad, Grund, nie das Credential), der Request läuft trotzdem durch. Eine FallbackPolicy und eigene Anforderungen der Anwendung (z.B. RequireAuthorization()) gelten weiterhin wie bei Disabled. Der User der Anwendung bleibt erhalten, eine erfolgreich geprüfte AUDIS-Identität wird ihm hinzugefügt. |
Enforce |
Fehlende oder ungültige Credentials werden mit 401 abgewiesen, ein Client außerhalb seiner Policies/Tenants mit 403. Der User am Endpunkt stammt dann nur aus den AUDIS-Schemes der Policy (ASP.NET-Core-Verhalten bei Policies mit Schemes): Eine über ein anderes Scheme der Anwendung authentifizierte Identität ist dort nicht sichtbar. |
Policies: Browser, ServiceToService, Webhook, Administration, Diagnostics (siehe AudisAuthPolicies). Weitere Policies müssen mit AddPolicy("<Name>") registriert werden; unbekannte Policy-Namen unter Authentication:Inbound:Policies lassen den Start fehlschlagen (Vergleich ohne Groß-/Kleinschreibung).
// Inbound (jeder Dienst)
builder.Services.AddAudisAuthentication(builder.Configuration)
.AddApiKey();
app.UseAuthentication();
app.UseAuthorization();
group.MapPost("/{tenantId}/{externalId}/external-knowledge", ...)
.RequireAudisAuth(AudisAuthPolicies.ServiceToService);
// Endpunkte ohne Policy bleiben unverändert.
// Outbound: ein HttpClient für viele Ziele, Credential pro Request
services.AddHttpClient<IEndpointNotifier, HttpEndpointNotifier>()
.AddAudisOutboundAuthentication();
request.Options.Set(AudisAuthRequestOptions.Credential, endpoint.Credential); // z.B. "analyzer-xy"
// Outbound: ein HttpClient für ein Ziel (Adapter, Analyzer), Credential fest am Client
services.AddHttpClient<IAudisClient, AudisClient>()
.AddAudisOutboundAuthentication("audis");
// ... oder Name aus der Konfiguration der Integration (leer = ohne Auth, opt-in)
services.AddHttpClient("weather-analyzer")
.AddAudisOutboundAuthentication(sp => sp.GetRequiredService<IConfiguration>()["Analyzers:Weather:Credential"]);
AddAudisAuthentication ist für Hosts (AUDIS) und Clients (Adapter, Analyzer) gleich: Ein Dienst, der nur authentifiziert sendet, registriert es ebenso; ohne konfigurierte Policies ändert sich für eingehende Requests nichts.
Konfiguration (appsettings.json bzw. Key Vault):
"Authentication": {
"Inbound": {
"ApiKey": {
"Clients": [
{ "Name": "health-dashboard", "Keys": [ "<neu>", "<alt>" ], "Policies": [ "Diagnostics" ] },
{ "Name": "cobra-adapter", "Keys": [ "<key>" ], "Policies": [ "ServiceToService" ], "Tenants": [ "tenant-a" ] }
]
},
"Policies": {
"ServiceToService": { "Schemes": [ "ApiKey" ], "Mode": "Audit" },
"Diagnostics": { "Schemes": [ "ApiKey" ], "Mode": "Enforce" }
}
},
"Outbound": {
"Credentials": {
"analyzer-xy": {
"Type": "ApiKey",
"Key": "<secret>",
"AllowedOrigins": [ "https://analyzer.example.org" ]
},
"function-analyzer": {
"Type": "ApiKey",
"Key": "<secret>",
"QueryParameter": "code",
"AllowedOrigins": [ "https://function.example.org" ]
}
}
}
}
Hinweise:
UseAuthentication()undUseAuthorization()sind erforderlich. AUDIS-Schemes werden nie Default-Scheme und laufen nur über AUDIS-Policies. Hat der Host genau ein eigenes Scheme (z.B. Cookie), bleibt es Default-Scheme wie ohne AUDIS; ein explizit gesetztes Default-Scheme bleibt unverändert.Disabled- und Audit-Policies verändern die Autorisierung eines Endpunkts nicht: Ohne eigene Autorisierung des Hosts gilt dessen
FallbackPolicy(wie ohne AUDIS-Metadaten), mit eigener Autorisierung (z.B.RequireAuthorization(...)) entscheidet nur diese. InEnforcezählen für die Rechte nur Identitäten aus den Schemes der AUDIS-Policy, nie die eines kombinierten Host-Schemes.Die Konfiguration wird beim Start (
ValidateOnStart) und bei jedem Config-Reload validiert: unbekannte Policies (nicht well-known und nicht mitAddPolicyregistriert), unbekannte Schemes,Audit/Enforceohne Schemes, ApiKey-Clients ohne Namen oder Key, unbekannte Policies oder ungültige Mandanten inPolicies/Tenantseines Clients, ungültigeHeader/Prefix/QueryParameter, Credentials ohne bzw. mit unbekanntemType, Credentials ohne oder mit ungültigenAllowedOriginsund die Settings jedes Credentials durch den Authenticator seinesType(z.B. ApiKey ohneKey). Fehlermeldungen enthalten nie Secrets.Alles wirkt ohne Neustart und ohne neues Release, sobald die Konfiguration neu geladen wird: Modus und Schemes einer Policy (Rollout
Disabled→Audit→Enforce, Wechsel z.B. vonApiKeyaufHmac), Clients, Keys,Policies/Tenants, Header-Einstellungen und Outbound-Credentials (Wechsel desType, Key-Rotation). Voraussetzung ist, dass der Dienst alle verwendeten Mechanismen registriert (AddApiKey(),AddHmac(),AddJwt()); die Konfiguration wählt nur aus. Ein ungültiger Reload wird nicht übernommen: Es bleibt die zuletzt gültige Konfiguration aktiv, inklusive der Secrets der Credentials, und es wird ein Fehler geloggt (EventId 1002, ohne Secrets). Key Vault lädt nur neu, wenn beim Einbinden einReloadIntervalgesetzt ist.Rechte pro Client:
Policiesbeschränkt einen Client auf bestimmte Policies,Tenantsauf bestimmte Mandanten (beides ohne Groß-/Kleinschreibung). Leere Listen beschränken nicht, bestehende Clients behalten ihre Rechte. Der Mandant eines Requests kommt aus dem Route-WertAuthentication:Inbound:TenantRouteValue(DefaulttenantId) oder aus einem eigenenIAudisTenantResolver(AddTenantResolver<T>()); Endpunkte ohne Mandant sind nur überPoliciesbeschränkt. InEnforcewird ein Request außerhalb der Rechte mit403abgewiesen, inAuditläuft er durch und wird als Warnung geloggt (EventId 1006, Policy, Pfad, Client-Name). Die Claimsaudis:policyundaudis:tenantstelltAudisClientScope.CreateClaimsaus; eigene Mechanismen nutzen dafürIAudisClientScope.ApiKey-Transport (eingehend unter
Inbound:ApiKey, ausgehend pro Credential):Header(DefaultX-Api-Key), optionalPrefix(z.B.BearerfürAuthorization: Bearer <key>; Werte ohne Präfix ignoriert das Scheme, damit z.B. JWT auf demselben Header weiter funktioniert) oderQueryParameterstatt Header (z.B.codefür Azure Functions).QueryParameterist mitHeader/Prefixnicht kombinierbar. Keys im Query-String können in Access-Logs landen; wenn möglich Header verwenden.ApiKey-Client-Namen müssen eindeutig sein (ohne Groß-/Kleinschreibung) und ein Key darf nur zu einem Client gehören.
Ist die ApiKey-Konfiguration nach einem Reload ungültig, bleiben die zuletzt gültigen Keys aktiv und es wird ein Fehler geloggt (EventId 1002 bei Validierungsfehlern, ohne Secrets; EventId 1003, wenn sich die Konfiguration nicht binden lässt, z.B. Text statt Zahl, nur mit Exception-Typ). Beim Start schlägt ungültige Konfiguration weiterhin sofort fehl.
Ausgehende Requests ohne
AudisAuthRequestOptions.Credential(und ohne am Client gebundenes Credential) werden unverändert gesendet. Ein am Client gebundenes Credential (AddAudisOutboundAuthentication("<name>")) gilt für jeden Request, außer der Request setztAudisAuthRequestOptions.Credentialselbst; ein explizit leerer Wert sendet ohne Credential. Ein unbekanntes Credential oder ein unbekannterTypeführt zu einerAudisOutboundAuthenticationException(fail closed). In Tenant- oder Revision-Settings und in Hangfire-Jobs steht nur der Name des Credentials, nie das Secret.Jedes Credential braucht
AllowedOrigins: die Origins (Schema, Host und optional Port, ohne Pfad, Query oder Fragment), an die das Credential gesendet werden darf, z.B.https://trust.example.orgoderhttps://trust.example.org:8443. Erlaubt ist nurhttps;httpnur für Loopback-Hosts (localhost,127.0.0.1,[::1]). Die Liste wird beim Start und bei jedem Config-Reload validiert und danach geparst zwischengespeichert (kein erneutes Parsen pro Request). Ist die Konfiguration nach einem Reload ungültig (z.B. ein ungültiger oder fehlender Origin), bleiben die zuletzt gültigenAllowedOriginsaktiv und es wird ein Fehler geloggt (EventId 1002, ohne Secrets); ein gültiger Reload wirkt ohne Neustart.Zielt ein Request mit Credential auf einen Origin, der nicht in
AllowedOriginssteht, wird er weder authentifiziert noch gesendet (fail closed, für alle Mechanismen wie ApiKey und Hmac):AudisOutboundOriginNotAllowedException(abgeleitet vonAudisOutboundAuthenticationException) und ein Error-Log (EventId 1004) mit Credential-Name und Request-Origin, ohne Pfad, Query oder Secret. So kann ein Credential nicht durch eine geänderte Ziel-URL (z.B. in Tenant-Settings) an einen fremden Host gelangen.Redirects (3xx) werden bei Clients mit
AddAudisOutboundAuthentication()nicht automatisch verfolgt: Am Primary-Handler (SocketsHttpHandlerbzw.HttpClientHandler) wirdAllowAutoRedirect = falsegesetzt, alle übrigen Einstellungen eines vom Host konfigurierten Primary-Handlers bleiben erhalten. Die 3xx-Response geht an den Aufrufer; ein verfolgter Redirect auf einen anderen Origin würde sonst das Credential (z.B.X-Api-Key) an einen nicht geprüften Host senden. Das gilt für alle Requests des Clients, auch ohne Credential (die Einstellung gehört zum Primary-Handler, nicht zum Request). Sollen Requests ohne Credential Redirects weiterhin folgen, sendet der Host sie über einen eigenen Client ohneAddAudisOutboundAuthentication(). Wird der Primary-Handler danach ersetzt und folgt Redirects, wird eine Response von einem anderen Origin verworfen:AudisOutboundOriginNotAllowedExceptionund Error-Log (EventId 1005) mit Credential-Name und Origins.Key Vault: Listen werden mit Index benannt, z.B.
Authentication--Outbound--Credentials--analyzer-xy--AllowedOrigins--0.Retry-Handler vor
AddAudisOutboundAuthentication()registrieren, damit jeder Versuch neu authentifiziert wird.Neue Verfahren brauchen Code, aber nur an einer Stelle pro Richtung: eingehend ein
IAudisAuthMechanism(AddMechanism, Settings unterInbound:<Name>, Rechte überIAudisClientScopeundAudisClientScope), ausgehend einIOutboundAuthenticator(AddOutboundAuthenticator<T>()), der mitValidateSettingsseine Credential-Settings beim Start und bei jedem Reload selbst prüft. Policies, Modi, Audit-Log, Rechte pro Client,AllowedOrigins, Redirect-Schutz und LastValid-Schutz gelten dann ohne weitere Änderung.AUDIS-Policies wirken auf Endpunkt-Ebene (
RequireAudisAuth(...), auch fürMapHub(...)). Die Anforderungen werten denHttpContextdes Requests aus: Bei einer Autorisierung mit einer anderen Ressource (z.B.[Authorize(Policy = ...)]an einer SignalR-Hub-Methode oderIAuthorizationService.AuthorizeAsyncmit eigener Ressource) wird der Zugriff inEnforceabgewiesen (fail closed) und inAuditals fehlendes Credential geloggt.
Lizenz
MIT, © softaware gmbh.
| 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
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Audis.Authentication:
| Package | Downloads |
|---|---|
|
Audis.Authentication.Hmac
HMAC mechanism for Audis.Authentication: inbound scheme wrapping softaware.Authentication.Hmac with distributed replay protection, algorithm allowlist and robust header validation, plus an outbound authenticator signing HttpClient requests. |
|
|
Audis.Authentication.Jwt
JWT mechanism for Audis.Authentication based on Microsoft.AspNetCore.Authentication.JwtBearer: validation of asymmetric (RS256/ES256) tokens of named issuers with public keys from configuration or JWKS, required claims, lifetime cap, per-request audience resolution and access_token query support for SignalR hubs. |
GitHub repositories
This package is not used by any popular GitHub repositories.