Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<!-- This should be passed from the VSTS build -->
<MicrosoftIdentityAbstractionsVersion Condition="'$(MicrosoftIdentityAbstractionsVersion)' == ''">9.1.0</MicrosoftIdentityAbstractionsVersion>
<MicrosoftIdentityAbstractionsVersion Condition="'$(MicrosoftIdentityAbstractionsVersion)' == ''">10.0.0</MicrosoftIdentityAbstractionsVersion>
<!-- This will generate AssemblyVersion, AssemblyFileVersion and AssemblyInformationVersion -->
<Version>$(MicrosoftIdentityAbstractionsVersion)</Version>
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)\build\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
Expand All @@ -25,6 +25,9 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>

<!-- public API breaking changes validation.
See https://learn.microsoft.com/dotnet/fundamentals/apicompat/package-validation/baseline-version-validator -->
<EnablePackageValidation>true</EnablePackageValidation>
<PackageValidationBaselineVersion>8.0.0</PackageValidationBaselineVersion>
<BannedApiAnalyzersVersion>3.3.4</BannedApiAnalyzersVersion>
Expand Down
7 changes: 7 additions & 0 deletions Microsoft.Identity.Abstractions.sln
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{D5BF0954-2
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Identity.Abstractions.Tests", "test\Microsoft.Identity.Abstractions.Tests\Microsoft.Identity.Abstractions.Tests.csproj", "{AC403F8B-5ADB-4037-A62A-73FEC3E7B0E2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Identity.Abstractions.AotTests", "test\Microsoft.Identity.Abstractions.AotTests\Microsoft.Identity.Abstractions.AotTests.csproj", "{EC129FAC-AEB8-D0EE-CFE6-028A77191A49}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -36,13 +38,18 @@ Global
{AC403F8B-5ADB-4037-A62A-73FEC3E7B0E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AC403F8B-5ADB-4037-A62A-73FEC3E7B0E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC403F8B-5ADB-4037-A62A-73FEC3E7B0E2}.Release|Any CPU.Build.0 = Release|Any CPU
{EC129FAC-AEB8-D0EE-CFE6-028A77191A49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EC129FAC-AEB8-D0EE-CFE6-028A77191A49}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EC129FAC-AEB8-D0EE-CFE6-028A77191A49}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EC129FAC-AEB8-D0EE-CFE6-028A77191A49}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{98F57CC8-01A0-49F3-B859-DDC4F8F5CD2F} = {68824A9C-D009-491A-8A76-680A261A8C71}
{AC403F8B-5ADB-4037-A62A-73FEC3E7B0E2} = {D5BF0954-25F6-40ED-9896-8EDB99EBEF5A}
{EC129FAC-AEB8-D0EE-CFE6-028A77191A49} = {D5BF0954-25F6-40ED-9896-8EDB99EBEF5A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {34D01AD8-BCE0-44B3-9197-439FF4A1D46D}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,31 @@ private string GenerateHash(string? secret)
/// or <see cref="CredentialSource.Path"/> or <see cref="CredentialSource.StoreWithDistinguishedName"/> or <see cref="CredentialSource.StoreWithThumbprint"/>
/// after the certificate is retrieved by a <see cref="ICredentialsLoader"/>, it will be stored in this property and also in the <see cref="CachedValue"/>.
/// </summary>
public X509Certificate2? Certificate { get; set; }
private X509Certificate2? Certificate { get; set; }

/// <summary>
/// When <see cref="SourceType"/> is <see cref="CredentialSource.Certificate"/>, you will use this property to provide the certificate yourself.
/// When <see cref="SourceType"/> is <see cref="CredentialSource.Base64Encoded"/> or <see cref="CredentialSource.KeyVault"/>
/// or <see cref="CredentialSource.Path"/> or <see cref="CredentialSource.StoreWithDistinguishedName"/> or <see cref="CredentialSource.StoreWithThumbprint"/>
/// after the certificate is retrieved by a <see cref="ICredentialsLoader"/>, it will be stored in this property and also in the <see cref="CachedValue"/>.
/// </summary>
#pragma warning disable CA1024 // Use properties where appropriate (because it's not AoT compatible)
public X509Certificate2? GetCertificate() => Certificate;

/// <summary>
/// When <see cref="SourceType"/> is <see cref="CredentialSource.Certificate"/>, you will use this property to provide the certificate yourself.
/// When <see cref="SourceType"/> is <see cref="CredentialSource.Base64Encoded"/> or <see cref="CredentialSource.KeyVault"/>
/// or <see cref="CredentialSource.Path"/> or <see cref="CredentialSource.StoreWithDistinguishedName"/> or <see cref="CredentialSource.StoreWithThumbprint"/>
/// after the certificate is retrieved by a <see cref="ICredentialsLoader"/>, it will be stored in this property and also in the <see cref="CachedValue"/>.
/// </summary>
/// <paramref name="certificate"> is the certificate to set.</paramref>
/// <returns>the CredentialDescription itself to chain initialization calls.</returns>
public CredentialDescription SetCertificate(X509Certificate2 certificate)
{
Certificate = certificate;
return this;
}
#pragma warning restore CA1024 // Use properties where appropriate (because it's not AoT compatible)

/// <summary>
/// When the credential is retrieved by a <see cref="ICredentialsLoader"/>, it will be stored in this property, where you can retrieve it. If the credential is a certificate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#if NET8_0_OR_GREATER
using System;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using System.Text.Json.Serialization;

Expand All @@ -14,6 +15,8 @@ namespace Microsoft.Identity.Abstractions
/// </summary>
/// <remarks>BE CAREFUL when you serialize a credential description. The secrets it contains
/// will be serialized too depending on the CredentialSource (ClientSecret, Base64Encoded, and Password)</remarks>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should expand the docs that for CustomSignedAssertionProviderData, JsonSerializerOptions.TypeInfoResolver can be used.

[RequiresDynamicCode("Uses JsonSerializer which may require dynamic code generation for certain types.")]
[RequiresUnreferencedCode("Uses JsonSerializer which may require dynamic code generation for certain types.")]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For DecryptKeysAuthenticationOptions, we could check if the options has a TypeInfoResolver, and if it doesn't then we could clone the options, and create a source generated context.

Copy link
Member

@bgavrilMS bgavrilMS Nov 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't this effectively break the AOT linker ?

public class CredentialDescriptionJsonConverter : JsonConverter<CredentialDescription>
{
/// <inheritdoc/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://learn.microsoft.com/dotnet/fundamentals/package-validation/diagnostic-ids -->
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.get_Certificate</Target>
<Left>lib/net462/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/net462/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.set_Certificate(System.Security.Cryptography.X509Certificates.X509Certificate2)</Target>
<Left>lib/net462/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/net462/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.get_Certificate</Target>
<Left>lib/net8.0/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/net8.0/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.set_Certificate(System.Security.Cryptography.X509Certificates.X509Certificate2)</Target>
<Left>lib/net8.0/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/net8.0/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.get_Certificate</Target>
<Left>lib/netstandard2.0/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/netstandard2.0/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.set_Certificate(System.Security.Cryptography.X509Certificates.X509Certificate2)</Target>
<Left>lib/netstandard2.0/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/netstandard2.0/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.get_Certificate</Target>
<Left>lib/netstandard2.1/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/netstandard2.1/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.CredentialDescription.set_Certificate(System.Security.Cryptography.X509Certificates.X509Certificate2)</Target>
<Left>lib/netstandard2.1/Microsoft.Identity.Abstractions.dll</Left>
<Right>lib/netstandard2.1/Microsoft.Identity.Abstractions.dll</Right>
<IsBaselineSuppression>true</IsBaselineSuppression>
</Suppression>
<Suppression>
<DiagnosticId>CP0006</DiagnosticId>
<Target>M:Microsoft.Identity.Abstractions.IDownstreamApi.PatchForAppAsync``1(System.String,``0,System.Action{Microsoft.Identity.Abstractions.DownstreamApiOptionsReadOnlyHttpMethod},System.Threading.CancellationToken)</Target>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
<ProjectGuid>{98F57CC8-01A0-49F3-B859-DDC4F8F5CD2F}</ProjectGuid>
<AnalysisMode>AllEnabledByDefault</AnalysisMode>
<PackageReadmeFile>README.md</PackageReadmeFile>
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
</PropertyGroup>

<PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ Microsoft.Identity.Abstractions.CredentialDescription
Microsoft.Identity.Abstractions.CredentialDescription.CredentialDescription(Microsoft.Identity.Abstractions.CredentialDescription! other) -> void
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.get -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDistinguishedName.get -> string?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#nullable enable
Microsoft.Identity.Abstractions.CredentialDescription.GetCertificate() -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.SetCertificate(System.Security.Cryptography.X509Certificates.X509Certificate2! certificate) -> Microsoft.Identity.Abstractions.CredentialDescription!
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>.CreateAuthorizationHeaderAsync(Microsoft.Identity.Abstractions.DownstreamApiOptions! downstreamApiOptions, System.Security.Claims.ClaimsPrincipal? claimsPrincipal = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TResult>!
Microsoft.Identity.Abstractions.MicrosoftEntraApplicationOptions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ Microsoft.Identity.Abstractions.CredentialDescription
Microsoft.Identity.Abstractions.CredentialDescription.CredentialDescription(Microsoft.Identity.Abstractions.CredentialDescription! other) -> void
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.get -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDistinguishedName.get -> string?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#nullable enable
Microsoft.Identity.Abstractions.CredentialDescription.GetCertificate() -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.SetCertificate(System.Security.Cryptography.X509Certificates.X509Certificate2! certificate) -> Microsoft.Identity.Abstractions.CredentialDescription!
Microsoft.Identity.Abstractions.CredentialDescriptionJsonConverter
Microsoft.Identity.Abstractions.CredentialDescriptionJsonConverter.CredentialDescriptionJsonConverter() -> void
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ Microsoft.Identity.Abstractions.CredentialDescription
Microsoft.Identity.Abstractions.CredentialDescription.CredentialDescription(Microsoft.Identity.Abstractions.CredentialDescription! other) -> void
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.get -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDistinguishedName.get -> string?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#nullable enable
Microsoft.Identity.Abstractions.CredentialDescription.GetCertificate() -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.SetCertificate(System.Security.Cryptography.X509Certificates.X509Certificate2! certificate) -> Microsoft.Identity.Abstractions.CredentialDescription!
Microsoft.Identity.Abstractions.CredentialDescriptionJsonConverter
Microsoft.Identity.Abstractions.CredentialDescriptionJsonConverter.CredentialDescriptionJsonConverter() -> void
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ Microsoft.Identity.Abstractions.CredentialDescription
Microsoft.Identity.Abstractions.CredentialDescription.CredentialDescription(Microsoft.Identity.Abstractions.CredentialDescription! other) -> void
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.get -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDistinguishedName.get -> string?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#nullable enable
Microsoft.Identity.Abstractions.CredentialDescription.GetCertificate() -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.SetCertificate(System.Security.Cryptography.X509Certificates.X509Certificate2! certificate) -> Microsoft.Identity.Abstractions.CredentialDescription!
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>.CreateAuthorizationHeaderAsync(Microsoft.Identity.Abstractions.DownstreamApiOptions! downstreamApiOptions, System.Security.Claims.ClaimsPrincipal? claimsPrincipal = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TResult>!
Microsoft.Identity.Abstractions.MicrosoftEntraApplicationOptions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ Microsoft.Identity.Abstractions.CredentialDescription
Microsoft.Identity.Abstractions.CredentialDescription.CredentialDescription(Microsoft.Identity.Abstractions.CredentialDescription! other) -> void
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.Base64EncodedValue.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.get -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.Certificate.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.get -> string?
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDiskPath.set -> void
Microsoft.Identity.Abstractions.CredentialDescription.CertificateDistinguishedName.get -> string?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#nullable enable
Microsoft.Identity.Abstractions.CredentialDescription.GetCertificate() -> System.Security.Cryptography.X509Certificates.X509Certificate2?
Microsoft.Identity.Abstractions.CredentialDescription.SetCertificate(System.Security.Cryptography.X509Certificates.X509Certificate2! certificate) -> Microsoft.Identity.Abstractions.CredentialDescription!
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>
Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider<TResult>.CreateAuthorizationHeaderAsync(Microsoft.Identity.Abstractions.DownstreamApiOptions! downstreamApiOptions, System.Security.Claims.ClaimsPrincipal? claimsPrincipal = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TResult>!
Microsoft.Identity.Abstractions.MicrosoftEntraApplicationOptions
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<OutputType>exe</OutputType>
<PublishAot>true</PublishAot>
<StartupObject>Mise.Configuration.Aot.Tests.Program</StartupObject>
<EnableConfigurationBindingGenerator>true</EnableConfigurationBindingGenerator>
<!--<NoWarn>SYSLIB1100;SYSLIB1101;SYSLIB0026;SYSLIB0027;SYSLIB0028</NoWarn>-->
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<!--<NoWarn>SYSLIB1100;SYSLIB1101;SYSLIB0026;SYSLIB0027;SYSLIB0028</NoWarn>-->

</PropertyGroup>

<ItemGroup>
<Content Include="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>


<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.4" />
</ItemGroup>


<ItemGroup>
<ProjectReference Include="..\..\src\Microsoft.Identity.Abstractions\Microsoft.Identity.Abstractions.csproj" />
</ItemGroup>


</Project>
Loading