Repository navigation
Released commit: 8bb3826c6adce78490f125676fe61fb3f84eb84c
Added
AccessDeniedException(access_denied, 403) andInvalidTargetException(invalid_target, 400) typed byMapOAuthError; neither counts toward the circuit breaker.AuthplaneMcpAuth.Options.ResourceMetadataUrlpoints theresource_metadatachallenge at an AS-hosted PRM document; validated at construction with the resource identifier's rules, andhttp://authserver:8080/...is accepted.- README Compatibility section: tested against authserver 0.2.0; introspection-based revocation requires authserver 0.1.2 or later.
- Resource-server DPoP nonce enforcement (RFC 9449 §9), opt-in via
InboundDPoPOptions.nonceIssuer;null, the default, leaves existing deployments unchanged. When enabled, every client's first DPoP request takes a 401use_dpop_nonceround trip. - Inbound DPoP nonce API:
IDPoPNonceIssuer,HmacDPoPNonceIssuer(key required;CreateEphemeral()for single-process),DPoPNonceRequiredException,AuthplaneErrors.ResponseHeadersandVerifiedClaims.NextDPoPNonce. Custom adapters must copy both onto the response. AuthplaneErrors.ErrorResponseBody(...),ErrorDescriptionFor(code)andErrorCodeFor(error)build the RFC 6750 §3 JSON error body and fixed description from the challenge's error code.Authplane.Mcp— the middleware logs the exception behind every failure:Errorfor a 5xx,Debugfor a rejection. Hosts without anILoggerFactoryget no output.
Changed
TokenRevokedExceptionfrom anactive=falseintrospection now names the other cause: the AS not recognising this resource server as the token's owner (authserver ≥ 0.1.2 runtime-client rule).- User guides document
access_deniedvsconsent_requiredon token exchange, theallowed_client_idsoperator step, and the confidential + runtime-client requirement for introspection. manual-e2e-setup.shno longer setsAUTHPLANE_CLIENT_CREDENTIALS_ENABLED(on by default since authserver 0.2.0) and acceptsAUTHSERVER_REFto check out an authserver ref before building.manual-e2e-smoke.shno longer callsPOST /admin/scopes(the route does not exist in authserver 0.2.0; the demo provisioner creates the scopes).OAuthProtectedResourceMetadata.GetDocumentUrlderives the document URL from the configured identifier string verbatim, query included. Migration: an identifier with an uppercase scheme or host, a default port or dot-segments now advertises a different URL; update hard-coded expectations.- Breaking A resource identifier must be an absolute URL with a scheme and host, with no fragment, userinfo, whitespace, backslash, C0 control or DEL, a port of in-range digits with no leading zero, and an RFC 3986 path and query; anything else throws
ArgumentExceptionat construction. Migration: configure the full URL and percent-encode offending octets. - The same identifier gates run in
ProtectedResourceMetadata's constructor andBuild. - BREAKING
AuthplaneErrors.WwwAuthenticate(...)now emits a fixederror_descriptionchosen by theerror=code instead of the exception message. Migration: logerror.Messageserver-side, or passverboseDescription: true. - BREAKING
Authplane.Mcp— every failure answers with an RFC 6750 §3 JSON body and a fixed description pererrorcode, instead of prose and the exception message. Migration: parseerroranderror_descriptionfrom the body. - BREAKING
Authplane.Mcp— a 503 (JWKS or metadata unreachable) answerstemporarily_unavailableinstead ofserver_error. Migration: matchtemporarily_unavailableto detect a transient outage.
Deprecated
VerifiedClaims.MayActmarked[Obsolete]: authserver 0.2.0 no longer issuesmay_act; removed in the next minor.
Fixed
- The MCP middleware's decoded-path fallback held
%5Cback from decoding while Kestrel decodes it, so a%5C-bearing resource identifier answered 401 at its own advertised metadata URL on hosts without a raw request target. AuthplaneResource.CreateAsyncno longer abandons theAuthplaneClientit builds when the resource constructor rejects its arguments;DisposeAsyncis now idempotent.- The authority now has an RFC 3986 §3.2.2 character-production gate, so an internationalized host is rejected at construction instead of reaching a
WWW-Authenticatechallenge as a non-URI. - An authority that is only userinfo (
https://user@) is reported as a missing host withArgumentException, instead of throwingIndexOutOfRangeException. AuthplaneClient.CreateAsyncno longer abandons the client it built when the priming metadata fetch fails or the caller's token is cancelled.- An opaque resource identifier such as
mailto:ops@example.comis no longer reported as carrying userinfo; it is still refused, now because an opaque URI has no host to derive a metadata document URL from. - The MCP middleware answers a JWKS or metadata outage with 503 instead of 401
invalid_token, and sendsWWW-Authenticateonly on a 401.