1+ using AuthServer . Constants ;
2+ using AuthServer . Core ;
3+ using AuthServer . Core . Abstractions ;
4+ using AuthServer . Endpoints . Abstractions ;
5+ using AuthServer . Endpoints . Responses ;
6+ using AuthServer . Options ;
7+ using Microsoft . AspNetCore . Http ;
8+ using Microsoft . Extensions . Options ;
9+ using Microsoft . FeatureManagement ;
10+
11+ namespace AuthServer . Discovery ;
12+
13+ internal class DiscoveryEndpointHandler : IEndpointHandler
14+ {
15+ private readonly IOptionsSnapshot < DiscoveryDocument > _discoveryDocumentOptions ;
16+ private readonly IFeatureManagerSnapshot _featureManagerSnapshot ;
17+ private readonly IEndpointResolver _endpointResolver ;
18+
19+ public DiscoveryEndpointHandler (
20+ IOptionsSnapshot < DiscoveryDocument > discoveryDocumentOptions ,
21+ IFeatureManagerSnapshot featureManagerSnapshot ,
22+ IEndpointResolver endpointResolver )
23+ {
24+ _discoveryDocumentOptions = discoveryDocumentOptions ;
25+ _featureManagerSnapshot = featureManagerSnapshot ;
26+ _endpointResolver = endpointResolver ;
27+ }
28+
29+ private DiscoveryDocument DiscoveryDocument => _discoveryDocumentOptions . Value ;
30+
31+ public async Task < IResult > Handle ( HttpContext httpContext , CancellationToken cancellationToken )
32+ {
33+ var response = new GetDiscoveryResponse
34+ {
35+ Issuer = DiscoveryDocument . Issuer ,
36+ ServiceDocumentation = DiscoveryDocument . ServiceDocumentation ,
37+ OpPolicyUri = DiscoveryDocument . OpPolicyUri ,
38+ OpTosUri = DiscoveryDocument . OpTosUri ,
39+ AuthorizationEndpoint = await Filter ( _endpointResolver . AuthorizationEndpoint , FeatureFlags . Authorize ) ,
40+ TokenEndpoint = await Filter ( _endpointResolver . TokenEndpoint , FeatureFlags . AuthorizationCode , FeatureFlags . RefreshToken , FeatureFlags . ClientCredentials ) ,
41+ UserinfoEndpoint = await Filter ( _endpointResolver . UserinfoEndpoint , FeatureFlags . Userinfo ) ,
42+ JwksUri = await Filter ( _endpointResolver . JwksEndpoint , FeatureFlags . Jwks ) ,
43+ RegistrationEndpoint = await Filter ( _endpointResolver . RegistrationEndpoint , FeatureFlags . RegisterGet , FeatureFlags . RegisterDelete , FeatureFlags . RegisterPost , FeatureFlags . RegisterPut ) ,
44+ EndSessionEndpoint = await Filter ( _endpointResolver . EndSessionEndpoint , FeatureFlags . EndSession ) ,
45+ IntrospectionEndpoint = await Filter ( _endpointResolver . IntrospectionEndpoint , FeatureFlags . TokenIntrospection ) ,
46+ RevocationEndpoint = await Filter ( _endpointResolver . RevocationEndpoint , FeatureFlags . TokenRevocation ) ,
47+ PushedAuthorizationRequestEndpoint = await Filter ( _endpointResolver . PushedAuthorizationEndpoint , FeatureFlags . PushedAuthorization ) ,
48+ GrantManagementEndpoint = await Filter ( _endpointResolver . GrantManagementEndpoint , FeatureFlags . GrantManagementRevoke , FeatureFlags . GrantManagementQuery ) ,
49+ ProtectedResources = DiscoveryDocument . ProtectedResources ,
50+ ClaimsSupported = DiscoveryDocument . ClaimsSupported ,
51+ ScopesSupported = DiscoveryDocument . ScopesSupported ,
52+ AcrValuesSupported = DiscoveryDocument . AcrValuesSupported ,
53+ ClaimTypesSupported = ClaimTypeConstants . ClaimTypes ,
54+ PromptValuesSupported = PromptConstants . Prompts ,
55+ DisplayValuesSupported = DisplayConstants . DisplayValues ,
56+ SubjectTypesSupported = SubjectTypeConstants . SubjectTypes ,
57+ GrantTypesSupported = GrantTypeConstants . GrantTypes ,
58+ ChallengeMethodsSupported = CodeChallengeMethodConstants . CodeChallengeMethods ,
59+ ResponseTypesSupported = ResponseTypeConstants . ResponseTypes ,
60+ ResponseModesSupported = ResponseModeConstants . ResponseModes ,
61+ IntrospectionEndpointAuthMethodsSupported = TokenEndpointAuthMethodConstants . SecureAuthMethods ,
62+ RevocationEndpointAuthMethodsSupported = TokenEndpointAuthMethodConstants . SecureAuthMethods ,
63+ TokenEndpointAuthMethodsSupported = TokenEndpointAuthMethodConstants . AuthMethods ,
64+ GrantManagementActionsSupported = GrantManagementActionConstants . GrantManagementActions ,
65+ IdTokenSigningAlgValuesSupported = DiscoveryDocument . IdTokenSigningAlgValuesSupported ,
66+ IdTokenEncryptionAlgValuesSupported = DiscoveryDocument . IdTokenEncryptionAlgValuesSupported ,
67+ IdTokenEncryptionEncValuesSupported = DiscoveryDocument . IdTokenEncryptionEncValuesSupported ,
68+ UserinfoSigningAlgValuesSupported = DiscoveryDocument . UserinfoSigningAlgValuesSupported ,
69+ UserinfoEncryptionAlgValuesSupported = DiscoveryDocument . UserinfoEncryptionAlgValuesSupported ,
70+ UserinfoEncryptionEncValuesSupported = DiscoveryDocument . UserinfoEncryptionEncValuesSupported ,
71+ RequestObjectSigningAlgValuesSupported = DiscoveryDocument . RequestObjectSigningAlgValuesSupported ,
72+ RequestObjectEncryptionAlgValuesSupported = DiscoveryDocument . RequestObjectEncryptionAlgValuesSupported ,
73+ RequestObjectEncryptionEncValuesSupported = DiscoveryDocument . RequestObjectEncryptionEncValuesSupported ,
74+ TokenEndpointAuthSigningAlgValuesSupported = DiscoveryDocument . TokenEndpointAuthSigningAlgValuesSupported ,
75+ TokenEndpointAuthEncryptionAlgValuesSupported = DiscoveryDocument . TokenEndpointAuthEncryptionAlgValuesSupported ,
76+ TokenEndpointAuthEncryptionEncValuesSupported = DiscoveryDocument . TokenEndpointAuthEncryptionEncValuesSupported ,
77+ AuthorizationResponseIssParameterSupported = true ,
78+ BackchannelLogoutSupported = true ,
79+ RequireRequestUriRegistration = true ,
80+ ClaimsParameterSupported = false ,
81+ RequestParameterSupported = true ,
82+ RequestUriParameterSupported = true ,
83+ RequireSignedRequestObject = DiscoveryDocument . RequireSignedRequestObject ,
84+ RequirePushedAuthorizationRequests = DiscoveryDocument . RequirePushedAuthorizationRequests ,
85+ GrantManagementActionRequired = DiscoveryDocument . GrantManagementActionRequired
86+ } ;
87+
88+ return Results . Ok ( response ) ;
89+ }
90+
91+ private async Task < T ? > Filter < T > ( T value , params string [ ] featureFlags )
92+ {
93+ foreach ( var featureFlag in featureFlags )
94+ {
95+ if ( await _featureManagerSnapshot . IsEnabledAsync ( featureFlag ) )
96+ {
97+ return value ;
98+ }
99+ }
100+
101+ return default ;
102+ }
103+ }
0 commit comments