1- [ ![ CI] ( https://github.com/AzureAD/microsoft-identity-abstractions-for-dotnet/actions/workflows/dotnetcore.yml/badge.svg )] ( https://github.com/AzureAD/microsoft-identity-abstractions-for-dotnet/actions/workflows/dotnetcore.yml )
1+ [ ![ CI] ( https://github.com/AzureAD/microsoft-identity-abstractions-for-dotnet/actions/workflows/dotnetcore.yml/badge.svg )] ( https://github.com/AzureAD/microsoft-identity-abstractions-for-dotnet/actions/workflows/dotnetcore.yml ) ![ Diagrams Synced ] ( https://img.shields.io/badge/Diagrams%20Synced-2025--10--15-blue )
22
33# Microsoft.Identity.Abstractions
44
55Microsoft.Identity.Abstractions contain interfaces and POCO classes used in the Microsoft .NET authentication
66libraries (Microsoft.IdentityModel, MSAL.NET and Microsoft.Identity.Web). It exposes concepts in three domains:
7+ - Application and credentials
8+ - Acquire tokens, get authorization headers and call downstream APIs
9+ - Extensibility to bring your own credential providers
710
811## NuGet Package
912
@@ -27,31 +30,33 @@ the following diagram provides an overview of the data classes exposed by Micros
2730
2831``` mermaid
2932classDiagram
30- namespace ApplicationOptions {
31- class CredentialDescription {
32- <<ro>> +string Id
33- <<rw>> +CredentialSource SourceType
34- <<rw>> +string KeyVaultUrl
35- <<rw>> +string CertificateStorePath
36- <<rw>> +string CertificateDistinguishedName
37- <<rw>> +string KeyVaultCertificateName
38- <<rw>> +string CertificateThumbprint
39- <<rw>> +string CertificateDiskPath
40- <<rw>> +string CertificatePassword
41- <<rw>> +string Base64EncodedValue
42- <<rw>> +string ClientSecret
43- <<rw>> +string ManagedIdentityClientId
44- <<rw>> +string SignedAssertionFileDiskPath
45- <<rw>> +AuthorizationHeaderProviderOptions DecryptKeysAuthenticationOptions
46- <<rw>> +string TokenExchangeAuthority
47- <<rw>> +X509Certificate2 Certificate
48- <<rw>> +Object CachedValue
49- <<rw>> +bool Skip
50- <<ro>> +CredentialType CredentialType
51- <<rw>> +string TokenExchangeUrl
52- <<rw>> +string CustomSignedAssertionProviderName
53- <<rw>> +Dictionary<string, Object> CustomSignedAssertionProviderData
54- }
33+ direction TB
34+ namespace ApplicationOptions {
35+ class CredentialDescription {
36+ <<ro>> +string Id
37+ <<rw>> +CredentialSource SourceType
38+ <<rw>> +string KeyVaultUrl
39+ <<rw>> +string CertificateStorePath
40+ <<rw>> +string CertificateDistinguishedName
41+ <<rw>> +string KeyVaultCertificateName
42+ <<rw>> +string CertificateThumbprint
43+ <<rw>> +string CertificateDiskPath
44+ <<rw>> +string CertificatePassword
45+ <<rw>> +string Base64EncodedValue
46+ <<rw>> +string ClientSecret
47+ <<rw>> +string ManagedIdentityClientId
48+ <<rw>> +string SignedAssertionFileDiskPath
49+ <<rw>> +AuthorizationHeaderProviderOptions DecryptKeysAuthenticationOptions
50+ <<rw>> +string TokenExchangeAuthority
51+ <<rw>> +X509Certificate2 Certificate
52+ <<rw>> +object CachedValue
53+ <<rw>> +bool Skip
54+ <<ro>> +CredentialType CredentialType
55+ <<rw>> +string TokenExchangeUrl
56+ <<rw>> +string CustomSignedAssertionProviderName
57+ <<rw>> +Dictionary<string, Object> CustomSignedAssertionProviderData
58+ <<rw>> +string Algorithm
59+ }
5560 class CredentialSource { <<enum>>
5661 Certificate = 0
5762 KeyVault = 1
@@ -73,64 +78,67 @@ classDiagram
7378 DecryptKeys = 3
7479 }
7580 class IdentityApplicationOptions {
76- <<rw>> +string Authority
77- <<rw>> +string ClientId
78- <<rw>> +bool EnablePiiLogging
79- <<rw>> +IDictionary<string, string> ExtraQueryParameters
80- <<rw>> +IEnumerable<CredentialDescription> ClientCredentials
81- <<rw>> +string Audience
82- <<rw>> +IEnumerable<string> Audiences
83- <<rw>> +IEnumerable<CredentialDescription> TokenDecryptionCredentials
84- <<rw>> +bool AllowWebApiToBeAuthorizedByACL
81+ <<rw>> +string Authority
82+ <<rw>> +string ClientId
83+ <<rw>> +bool EnablePiiLogging
84+ <<rw>> +IDictionary<string, string> ExtraQueryParameters
85+ <<rw>> +IEnumerable<CredentialDescription> ClientCredentials
86+ <<rw>> +string Audience
87+ <<rw>> +IEnumerable<string> Audiences
88+ <<rw>> +IEnumerable<CredentialDescription> TokenDecryptionCredentials
89+ <<rw>> +bool AllowWebApiToBeAuthorizedByACL
8590 }
8691 class MicrosoftEntraApplicationOptions {
87- <<rw>> +string Instance
88- <<rw>> +string TenantId
89- <<rw>> +string Authority
90- <<rw>> +string AppHomeTenantId
91- <<rw>> +string AzureRegion
92- <<rw>> +IEnumerable<string> ClientCapabilities
93- <<rw>> +bool SendX5C
92+ <<rw>> +string Name
93+ <<rw>> +string Instance
94+ <<rw>> +string TenantId
95+ <<rw>> +string Authority
96+ <<rw>> +string AppHomeTenantId
97+ <<rw>> +string AzureRegion
98+ <<rw>> +IEnumerable<string> ClientCapabilities
99+ <<rw>> +bool SendX5C
94100 }
95101 class MicrosoftIdentityApplicationOptions {
96- <<rw>> +bool WithSpaAuthCode
97- <<rw>> +string Domain
98- <<rw>> +string EditProfilePolicyId
99- <<rw>> +string SignUpSignInPolicyId
100- <<rw>> +string ResetPasswordPolicyId
101- <<ro>> +string DefaultUserFlow
102- <<rw>> +string ResetPasswordPath
103- <<rw>> +string ErrorPath
102+ <<rw>> +bool WithSpaAuthCode
103+ <<rw>> +string Domain
104+ <<rw>> +string EditProfilePolicyId
105+ <<rw>> +string SignUpSignInPolicyId
106+ <<rw>> +string ResetPasswordPolicyId
107+ <<ro>> +string DefaultUserFlow
108+ <<rw>> +string ResetPasswordPath
109+ <<rw>> +string ErrorPath
104110 }
105111 }
106112
107- namespace TokenAcquisition {
113+ namespace TokenAcquisition {
108114 class AcquireTokenOptions {
109- +AcquireTokenOptions Clone()
110- <<rw>> +string AuthenticationOptionsName
111- <<rw>> +Nullable<Guid> CorrelationId
112- <<rw>> +IDictionary<string, string> ExtraQueryParameters
113- <<rw>> +IDictionary<string, Object> ExtraParameters
114- <<rw>> +IDictionary<string, string> ExtraHeadersParameters
115- <<rw>> +string Claims
116- <<rw>> +string FmiPath
117- <<rw>> +bool ForceRefresh
118- <<rw>> +string PopPublicKey
119- <<rw>> +string PopClaim
120- <<rw>> +ManagedIdentityOptions ManagedIdentity
121- <<rw>> +string LongRunningWebApiSessionKey
122- <<ro>> +string LongRunningWebApiSessionKeyAuto
123- <<rw>> +string Tenant
124- <<rw>> +string UserFlow
115+ +AcquireTokenOptions Clone()
116+ <<rw>> +string AuthenticationOptionsName
117+ <<rw>> +Nullable<Guid> CorrelationId
118+ <<rw>> +IDictionary<string, string> ExtraQueryParameters
119+ <<rw>> +IDictionary<string, Object> ExtraParameters
120+ <<rw>> +IDictionary<string, string> ExtraHeaderParameters
121+ <<rw>> +string Claims
122+ <<rw>> +string FmiPath
123+ <<rw>> +bool ForceRefresh
124+ <<rw>> +string PopPublicKey
125+ <<rw>> +string PopClaim
126+ <<rw>> +ManagedIdentityOptions ManagedIdentity
127+ <<rw>> +string LongRunningWebApiSessionKey
128+ <<ro>> +string LongRunningWebApiSessionKeyAuto
129+ <<rw>> +string Tenant
130+ <<rw>> +string UserFlow
125131 }
126132 class AcquireTokenResult {
127- <<rw>> +string AccessToken
128- <<rw>> +DateTimeOffset ExpiresOn
129- <<rw>> +string TenantId
130- <<rw>> +string IdToken
131- <<rw>> +IEnumerable<string> Scopes
132- <<rw>> +Guid CorrelationId
133- <<rw>> +string TokenType
133+ <<rw>> +string AccessToken
134+ <<rw>> +DateTimeOffset ExpiresOn
135+ <<rw>> +string TenantId
136+ <<rw>> +string IdToken
137+ <<rw>> +IEnumerable<string> Scopes
138+ <<rw>> +Guid CorrelationId
139+ <<rw>> +string TokenType
140+ <<rw>> +IReadOnlyDictionary<string, string> AdditionalResponseParameters
141+ <<rw>> +X509Certificate2 BindingCertificate
134142 }
135143 class ITokenAcquirer { <<interface>>
136144 +Task<AcquireTokenResult> GetTokenForUserAsync(IEnumerable<string> scopes, AcquireTokenOptions tokenAcquisitionOptions, ClaimsPrincipal user, CancellationToken cancellationToken)
@@ -151,31 +159,38 @@ classDiagram
151159 +AuthorizationHeaderProviderOptions Clone()
152160 #AuthorizationHeaderProviderOptions CloneInternal()
153161 +string GetApiUrl()
154- <<rw>> +string BaseUrl
155- <<rw>> +string RelativePath
156- <<rw>> +string HttpMethod
157- <<rw>> +Action<HttpRequestMessage> CustomizeHttpRequestMessage
158- <<rw>> +AcquireTokenOptions AcquireTokenOptions
159- <<rw>> +string ProtocolScheme
160- <<rw>> +bool RequestAppToken
162+ <<rw>> +string BaseUrl
163+ <<rw>> +string RelativePath
164+ <<rw>> +string HttpMethod
165+ <<rw>> +Action<HttpRequestMessage> CustomizeHttpRequestMessage
166+ <<rw>> +AcquireTokenOptions AcquireTokenOptions
167+ <<rw>> +string ProtocolScheme
168+ <<rw>> +bool RequestAppToken
161169 }
162170 class DownstreamApiOptions {
163171 +DownstreamApiOptions Clone()
164172 #AuthorizationHeaderProviderOptions CloneInternal()
165- <<rw>> +IEnumerable<string> Scopes
166- <<rw>> +Func<Object, HttpContent> Serializer
167- <<rw>> +Func<HttpContent, Object > Deserializer
168- <<rw>> +string AcceptHeader
169- <<rw>> +string ContentType
170- <<rw>> +string ExtraQueryParameters
171- <<rw>> +string ExtraHeadersParameters
173+ <<rw>> +IEnumerable<string> Scopes
174+ <<rw>> +Func<object?, HttpContent? > Serializer
175+ <<rw>> +Func<HttpContent?,object? > Deserializer
176+ <<rw>> +string AcceptHeader
177+ <<rw>> +string ContentType
178+ <<rw>> +IDictionary< string, string> ExtraQueryParameters
179+ <<rw>> +IDictionary< string, string> ExtraHeaderParameters
172180 }
173181 class DownstreamApiOptionsReadOnlyHttpMethod {
174182 +DownstreamApiOptionsReadOnlyHttpMethod Clone()
175183 #AuthorizationHeaderProviderOptions CloneInternal()
176- <<rw >> +string HttpMethod
184+ <<ro >> +string HttpMethod
177185 }
178186
187+ class IAuthorizationHeaderProvider { <<interface>> }
188+ class IAuthorizationHeaderProvider_TResult_ { <<interface>> }
189+ class IDownstreamApi { <<interface>>
190+ +CallApiAsync(...)
191+ +CallApiForUserAsync(...)
192+ +CallApiForAppAsync(...)
193+ +Generic overloads() ... }
179194 }
180195
181196
@@ -199,6 +214,11 @@ classDiagram
199214 ITokenAcquirer --> AcquireTokenResult : returns
200215```
201216
217+ Note:
218+ - for ` AuthorizationHeaderProviderOptions ` "Defaults: ProtocolScheme=Bearer, HttpMethod=Get"
219+ - for ` DownstreamApiOptions ` "Defaults: AcceptHeader=application/json, ContentType=application/json
220+ - for ` IdentityApplicationOptions ` "Effective audiences = Audience ∪ Audiences"
221+
202222### Application options and credentials
203223
204224 The application options are typically the options that you find in configuration files like the appsettings.json
@@ -230,6 +250,7 @@ classDiagram
230250 <<rw>> +string TokenExchangeUrl
231251 <<rw>> +string CustomSignedAssertionProviderName
232252 <<rw>> +Dictionary<string, Object> CustomSignedAssertionProviderData
253+ <<rw>> +string Algorithm
233254 }
234255 class CredentialSource { <<enum>>
235256 Certificate = 0
@@ -263,6 +284,7 @@ classDiagram
263284 <<rw>> +bool AllowWebApiToBeAuthorizedByACL
264285 }
265286 class MicrosoftEntraApplicationOptions {
287+ <<rw>> +string Name
266288 <<rw>> +string Instance
267289 <<rw>> +string TenantId
268290 <<rw>> +string Authority
@@ -348,7 +370,7 @@ classDiagram
348370 <<rw>> +Nullable<Guid> CorrelationId
349371 <<rw>> +IDictionary<string, string> ExtraQueryParameters
350372 <<rw>> +IDictionary<string, Object> ExtraParameters
351- <<rw>> +IDictionary<string, string> ExtraHeadersParameters
373+ <<rw>> +IDictionary<string, string> ExtraHeaderParameters
352374 <<rw>> +string Claims
353375 <<rw>> +string FmiPath
354376 <<rw>> +bool ForceRefresh
@@ -368,6 +390,8 @@ classDiagram
368390 <<rw>> +IEnumerable<string> Scopes
369391 <<rw>> +Guid CorrelationId
370392 <<rw>> +string TokenType
393+ <<rw>> +IReadOnlyDictionary<string, string> AdditionalResponseParameters
394+ <<rw>> +X509Certificate2 BindingCertificate
371395 }
372396 class ITokenAcquirer { <<interface>>
373397 +Task<AcquireTokenResult> GetTokenForUserAsync(IEnumerable<string> scopes, AcquireTokenOptions tokenAcquisitionOptions, ClaimsPrincipal user, CancellationToken cancellationToken)
@@ -422,12 +446,12 @@ It's also possible (and recommended) to use higher level APIs:
422446 <<rw>> +string AcceptHeader
423447 <<rw>> +string ContentType
424448 <<rw>> +IDictionary<string, string> ExtraQueryParameters
425- <<rw>> +IDictionary<string, string> ExtraHeadersParameters
449+ <<rw>> +IDictionary<string, string> ExtraHeaderParameters
426450 }
427451 class DownstreamApiOptionsReadOnlyHttpMethod {
428452 +DownstreamApiOptionsReadOnlyHttpMethod Clone()
429453 #AuthorizationHeaderProviderOptions CloneInternal()
430- <<rw >> +string HttpMethod
454+ <<ro >> +string HttpMethod
431455 }
432456 class IAuthorizationHeaderProvider { <<interface>>
433457 +Task<string> CreateAuthorizationHeaderForUserAsync(IEnumerable<string> scopes, AuthorizationHeaderProviderOptions authorizationHeaderProviderOptions, ClaimsPrincipal claimsPrincipal, CancellationToken cancellationToken)
@@ -496,10 +520,36 @@ It's also possible (and recommended) to use higher level APIs:
496520 AcquireTokenOptions --> "ManagedIdentity" ManagedIdentityOptions : Has
497521 IDownstreamApi ..> DownstreamApiOptions : Uses
498522 IAuthorizationHeaderProvider ..> AuthorizationHeaderProviderOptions : Uses
523+
499524```
500525
501526
527+ ### Extensibility
528+ Credential loading extensibility points.
502529
530+ ``` mermaid
531+ classDiagram
532+ class CredentialSourceLoaderParameters {
533+ +string ClientId
534+ +string Authority
535+ }
536+ class ICredentialSourceLoader { <<interface>>
537+ +Task LoadIfNeededAsync(CredentialDescription, CredentialSourceLoaderParameters?)
538+ +CredentialSource CredentialSource
539+ }
540+ class ICustomSignedAssertionProvider { <<interface>>
541+ +string Name
542+ }
543+ class ICredentialsLoader { <<interface>>
544+ +IDictionary<CredentialSource, ICredentialSourceLoader> CredentialSourceLoaders
545+ +Task LoadCredentialsIfNeededAsync(CredentialDescription, CredentialSourceLoaderParameters?)
546+ +Task <CredentialDescription?> LoadFirstValidCredentialsAsync(IEnumerable<CredentialDescription>, CredentialSourceLoaderParameters?)
547+ +void ResetCredentials(IEnumerable<CredentialDescription>)
548+ }
549+ ICredentialSourceLoader <|-- ICustomSignedAssertionProvider : Inherits
550+ ICredentialsLoader --> ICredentialSourceLoader : Uses
551+ ICredentialSourceLoader --> CredentialSourceLoaderParameters : Uses
552+ ```
503553
504554## Contributing
505555
0 commit comments