1- using Fido2NetLib ;
1+ using System . ComponentModel ;
2+
3+ using Fido2NetLib ;
24
35using Microsoft . Extensions . Configuration ;
46using Microsoft . Extensions . DependencyInjection . Extensions ;
79
810namespace Microsoft . Extensions . DependencyInjection ;
911
12+ /// <summary>
13+ /// Extension methods for configuring FIDO2 services in an <see cref="IServiceCollection"/>.
14+ /// </summary>
1015public static class Fido2NetLibBuilderExtensions
1116{
17+ /// <summary>
18+ /// Adds FIDO2 services to the specified service collection using configuration from an IConfiguration instance.
19+ /// </summary>
20+ /// <param name="services">The service collection to add FIDO2 services to.</param>
21+ /// <param name="configuration">The configuration containing FIDO2 settings.</param>
22+ /// <returns>An <see cref="IFido2NetLibBuilder"/> for configuring additional FIDO2 services.</returns>
23+ /// <remarks>
24+ /// This method registers the core FIDO2 services:
25+ /// <list type="bullet">
26+ /// <item><description><see cref="IFido2"/> as a scoped service</description></item>
27+ /// <item><description><see cref="Fido2Configuration"/> as a singleton from configuration</description></item>
28+ /// <item><description><see cref="ISystemClock"/> as a singleton (if not already registered)</description></item>
29+ /// </list>
30+ /// No metadata service is registered by default. Use the returned builder to add metadata services.
31+ /// </remarks>
32+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="services"/> or <paramref name="configuration"/> is null.</exception>
1233 public static IFido2NetLibBuilder AddFido2 ( this IServiceCollection services , IConfiguration configuration )
1334 {
1435 services . Configure < Fido2Configuration > ( configuration ) ;
@@ -22,6 +43,22 @@ public static IFido2NetLibBuilder AddFido2(this IServiceCollection services, ICo
2243 return new Fido2NetLibBuilder ( services ) ;
2344 }
2445
46+ /// <summary>
47+ /// Adds FIDO2 services to the specified service collection using a configuration action.
48+ /// </summary>
49+ /// <param name="services">The service collection to add FIDO2 services to.</param>
50+ /// <param name="setupAction">An action to configure the FIDO2 configuration options.</param>
51+ /// <returns>An <see cref="IFido2NetLibBuilder"/> for configuring additional FIDO2 services.</returns>
52+ /// <remarks>
53+ /// This method registers the core FIDO2 services:
54+ /// <list type="bullet">
55+ /// <item><description><see cref="IFido2"/> as a scoped service</description></item>
56+ /// <item><description><see cref="Fido2Configuration"/> as a singleton from the setup action</description></item>
57+ /// <item><description><see cref="ISystemClock"/> as a singleton (if not already registered)</description></item>
58+ /// </list>
59+ /// No metadata service is registered by default. Use the returned builder to add metadata services.
60+ /// </remarks>
61+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="services"/> or <paramref name="setupAction"/> is null.</exception>
2562 public static IFido2NetLibBuilder AddFido2 ( this IServiceCollection services , Action < Fido2Configuration > setupAction )
2663 {
2764 services . Configure ( setupAction ) ;
@@ -35,20 +72,56 @@ public static IFido2NetLibBuilder AddFido2(this IServiceCollection services, Act
3572 return new Fido2NetLibBuilder ( services ) ;
3673 }
3774
75+ /// <summary>
76+ /// Adds a custom metadata service implementation to the FIDO2 builder.
77+ /// </summary>
78+ /// <typeparam name="T">The type of metadata service to add. Must implement <see cref="IMetadataService"/>.</typeparam>
79+ /// <param name="builder">The FIDO2 builder instance.</param>
80+ /// <returns>The <see cref="IFido2NetLibBuilder"/> for method chaining.</returns>
81+ /// <remarks>
82+ /// This method registers the specified metadata service implementation as a scoped service,
83+ /// replacing any previously registered <see cref="IMetadataService"/>.
84+ /// </remarks>
85+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="builder"/> is null.</exception>
3886 public static IFido2NetLibBuilder AddMetadataService < T > ( this IFido2NetLibBuilder builder )
3987 where T : class , IMetadataService
4088 {
4189 builder . Services . AddScoped < IMetadataService , T > ( ) ;
4290 return builder ;
4391 }
4492
45-
93+ /// <summary>
94+ /// Adds the distributed cache-based metadata service to the FIDO2 builder.
95+ /// </summary>
96+ /// <param name="builder">The FIDO2 builder instance.</param>
97+ /// <returns>The <see cref="IFido2NetLibBuilder"/> for method chaining.</returns>
98+ /// <remarks>
99+ /// This method registers the <see cref="DistributedCacheMetadataService"/> as a scoped service.
100+ /// This service provides caching capabilities for metadata using both memory and distributed cache.
101+ /// Ensure that memory cache and distributed cache services are registered before calling this method.
102+ /// Use the returned builder to add metadata repositories.
103+ /// </remarks>
104+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="builder"/> is null.</exception>
46105 public static IFido2NetLibBuilder AddCachedMetadataService ( this IFido2NetLibBuilder builder )
47106 {
48107 builder . Services . AddScoped < IMetadataService , DistributedCacheMetadataService > ( ) ;
49108 return builder ;
50109 }
51-
110+
111+ /// <summary>
112+ /// Adds a file system-based metadata repository to the FIDO2 builder.
113+ /// </summary>
114+ /// <param name="builder">The FIDO2 builder instance.</param>
115+ /// <param name="directoryPath">The directory path containing metadata statement JSON files.</param>
116+ /// <returns>The <see cref="IFido2NetLibBuilder"/> for method chaining.</returns>
117+ /// <remarks>
118+ /// This method registers a <see cref="FileSystemMetadataRepository"/> as a scoped service.
119+ /// The repository loads metadata statements from JSON files in the specified directory.
120+ /// Each file should contain a valid metadata statement JSON document.
121+ /// This is typically used for development, testing, or offline scenarios.
122+ /// </remarks>
123+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="builder"/> or <paramref name="directoryPath"/> is null.</exception>
124+ /// <exception cref="DirectoryNotFoundException">Thrown when the specified directory does not exist at runtime.</exception>
52125 public static IFido2NetLibBuilder AddFileSystemMetadataRepository ( this IFido2NetLibBuilder builder , string directoryPath )
53126 {
54127 builder . Services . AddScoped < IMetadataRepository , FileSystemMetadataRepository > ( provider =>
@@ -59,6 +132,21 @@ public static IFido2NetLibBuilder AddFileSystemMetadataRepository(this IFido2Net
59132 return builder ;
60133 }
61134
135+ /// <summary>
136+ /// DO NOT USE IN PRODUCTION: Adds a conformance metadata repository to the FIDO2 builder for FIDO Alliance conformance testing.
137+ /// </summary>
138+ /// <param name="builder">The FIDO2 builder instance.</param>
139+ /// <param name="client">Optional HTTP client to use for requests. If null, a default client will be created.</param>
140+ /// <param name="origin">The origin URL for conformance testing requests.</param>
141+ /// <returns>The <see cref="IFido2NetLibBuilder"/> for method chaining.</returns>
142+ /// <remarks>
143+ /// This method registers a <see cref="ConformanceMetadataRepository"/> as a scoped service.
144+ /// This repository is specifically designed for FIDO Alliance conformance testing and fetches
145+ /// metadata from the conformance testing endpoints. It combines multiple metadata sources
146+ /// into a single BLOB for comprehensive testing scenarios.
147+ /// </remarks>
148+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="builder"/> is null.</exception>
149+ [ EditorBrowsable ( EditorBrowsableState . Never ) ]
62150 public static IFido2NetLibBuilder AddConformanceMetadataRepository (
63151 this IFido2NetLibBuilder builder ,
64152 HttpClient client = null ,
@@ -71,7 +159,24 @@ public static IFido2NetLibBuilder AddConformanceMetadataRepository(
71159
72160 return builder ;
73161 }
74-
162+
163+ /// <summary>
164+ /// Adds the official FIDO Alliance Metadata Service (MDS) repository to the FIDO2 builder.
165+ /// </summary>
166+ /// <param name="builder">The FIDO2 builder instance.</param>
167+ /// <param name="clientBuilder">Optional action to configure the HTTP client used for MDS requests.</param>
168+ /// <returns>The <see cref="IFido2NetLibBuilder"/> for method chaining.</returns>
169+ /// <remarks>
170+ /// This method registers a <see cref="Fido2MetadataServiceRepository"/> as a scoped service
171+ /// and configures an HTTP client specifically for communicating with the FIDO Alliance MDS v3
172+ /// endpoint at https://mds3.fidoalliance.org/. The repository fetches and validates
173+ /// JWT-signed metadata BLOBs containing authenticator metadata and certification status.
174+ ///
175+ /// The HTTP client is registered with a specific name and can be further configured
176+ /// using the optional <paramref name="clientBuilder"/> action (e.g., for adding authentication,
177+ /// custom headers, or timeout settings).
178+ /// </remarks>
179+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="builder"/> is null.</exception>
75180 public static IFido2NetLibBuilder AddFidoMetadataRepository ( this IFido2NetLibBuilder builder , Action < IHttpClientBuilder > clientBuilder = null )
76181 {
77182 var httpClientBuilder = builder . Services . AddHttpClient ( nameof ( Fido2MetadataServiceRepository ) , client =>
@@ -88,11 +193,17 @@ public static IFido2NetLibBuilder AddFidoMetadataRepository(this IFido2NetLibBui
88193 }
89194}
90195
196+ /// <summary>
197+ /// Provides a builder interface for configuring FIDO2 services.
198+ /// </summary>
91199public interface IFido2NetLibBuilder
92200{
93201 IServiceCollection Services { get ; }
94202}
95203
204+ /// <summary>
205+ /// Default implementation of <see cref="IFido2NetLibBuilder"/> for configuring FIDO2 services.
206+ /// </summary>
96207public class Fido2NetLibBuilder : IFido2NetLibBuilder
97208{
98209 /// <summary>
0 commit comments