Skip to content

Commit 74c8b82

Browse files
keegan-carusoKeegan Caruso
andauthored
Make the sidecar trim friendlier (#3518)
Co-authored-by: Keegan Caruso <[email protected]>
1 parent ab1b2fb commit 74c8b82

12 files changed

+65
-64
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System.Text.Json.Serialization;
5+
using Microsoft.Identity.Web.Sidecar.Models;
6+
7+
namespace Microsoft.Identity.Web.Sidecar;
8+
9+
[JsonSerializable(typeof(AuthorizationHeaderResult))]
10+
[JsonSerializable(typeof(DownstreamApiResult))]
11+
[JsonSerializable(typeof(ValidateAuthorizationHeaderResult))]
12+
internal partial class AppJsonSerializerContext : JsonSerializerContext
13+
{
14+
15+
}

src/Microsoft.Identity.Web.Sidecar/CacheControl.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
using Azure;
54
using Microsoft.Net.Http.Headers;
65

76
namespace Microsoft.Identity.Web.Sidecar;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<Project>
2+
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
3+
<PropertyGroup>
4+
<TargetFrameworks>net9.0</TargetFrameworks>
5+
</PropertyGroup>
6+
<PropertyGroup>
7+
<AspDependencyVersion>9.0.9</AspDependencyVersion>
8+
<MicrosoftAspNetCoreAuthenticationJwtBearerVersion>$(AspDependencyVersion)</MicrosoftAspNetCoreAuthenticationJwtBearerVersion>
9+
<MicrosoftAspNetCoreAuthenticationOpenIdConnectVersion>$(AspDependencyVersion)</MicrosoftAspNetCoreAuthenticationOpenIdConnectVersion>
10+
<MicrosoftAspNetCoreOpenApiVersion>$(AspDependencyVersion)</MicrosoftAspNetCoreOpenApiVersion>
11+
<MicrosoftExtensionsApiDescriptionServerVersion>$(AspDependencyVersion)</MicrosoftExtensionsApiDescriptionServerVersion>
12+
<MicrosoftVisualStudioAzureContainersToolsTargetsVersion>1.22.1</MicrosoftVisualStudioAzureContainersToolsTargetsVersion>
13+
</PropertyGroup>
14+
</Project>

src/Microsoft.Identity.Web.Sidecar/Endpoints/AuthorizationHeaderEndpoint.cs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22
// Licensed under the MIT License.
33

44
using System.ComponentModel;
5-
using System.Net.Mime;
65
using Microsoft.AspNetCore.Http.HttpResults;
76
using Microsoft.AspNetCore.Mvc;
87
using Microsoft.Extensions.Options;
98
using Microsoft.Identity.Abstractions;
109
using Microsoft.Identity.Client;
1110
using Microsoft.Identity.Web.Sidecar.Logging;
1211
using Microsoft.Identity.Web.Sidecar.Models;
13-
using Microsoft.OpenApi.Models;
1412

1513
namespace Microsoft.Identity.Web.Sidecar.Endpoints;
1614

@@ -31,8 +29,7 @@ public static void AddAuthorizationHeaderRequestEndpoints(this WebApplication ap
3129
" ?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read\n" +
3230
" ?optionsOverride.RequestAppToken=true&optionsOverride.Scopes=https://graph.microsoft.com/.default\n" +
3331
" ?optionsOverride.AcquireTokenOptions.Tenant=GUID\n" +
34-
"Repeat parameters like 'optionsOverride.Scopes' to add multiple scopes.").
35-
WithOpenApi(ConfigureOpenAPI);
32+
"Repeat parameters like 'optionsOverride.Scopes' to add multiple scopes.");
3633

3734
app.MapGet("/AuthorizationHeaderUnauthenticated/{apiName}", AuthorizationHeaderAsync).
3835
WithName("AuthorizationHeaderUnauthenticated").
@@ -47,20 +44,7 @@ public static void AddAuthorizationHeaderRequestEndpoints(this WebApplication ap
4744
" ?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read\n" +
4845
" ?optionsOverride.RequestAppToken=true&optionsOverride.Scopes=https://graph.microsoft.com/.default\n" +
4946
" ?optionsOverride.AcquireTokenOptions.Tenant=GUID\n" +
50-
"Repeat parameters like 'optionsOverride.Scopes' to add multiple scopes.").
51-
WithOpenApi(ConfigureOpenAPI);
52-
}
53-
54-
private static OpenApiOperation ConfigureOpenAPI(OpenApiOperation operation)
55-
{
56-
// Only add once.
57-
var documented = operation.Extensions.ContainsKey("x-optionsOverride-documented");
58-
if (!documented)
59-
{
60-
OpenApiDescriptions.AddOptionsOverrideParameters(operation);
61-
operation.Extensions.Add("x-optionsOverride-documented", new OpenApi.Any.OpenApiBoolean(true));
62-
}
63-
return operation;
47+
"Repeat parameters like 'optionsOverride.Scopes' to add multiple scopes.");
6448
}
6549

6650
private static async Task<Results<Ok<AuthorizationHeaderResult>, ProblemHttpResult>> AuthorizationHeaderAsync(

src/Microsoft.Identity.Web.Sidecar/Endpoints/DownstreamApiEndpoint.cs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33

44
using System.ComponentModel;
55
using System.Net.Http.Headers;
6-
using System.Net.Mime;
76
using System.Text;
87
using Microsoft.AspNetCore.Http.HttpResults;
98
using Microsoft.AspNetCore.Mvc;
109
using Microsoft.Extensions.Options;
1110
using Microsoft.Identity.Abstractions;
11+
using Microsoft.Identity.Client;
1212
using Microsoft.Identity.Web.Sidecar.Logging;
1313
using Microsoft.Identity.Web.Sidecar.Models;
14-
using Microsoft.OpenApi.Models;
1514

1615
namespace Microsoft.Identity.Web.Sidecar.Endpoints;
1716

@@ -31,8 +30,7 @@ public static void AddDownstreamApiRequestEndpoints(this WebApplication app)
3130
" ?optionsOverride.Scopes=User.Read\n" +
3231
" ?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read\n" +
3332
" ?optionsOverride.AcquireTokenOptions.Tenant=GUID\n" +
34-
" ?optionsOverride.RequestAppToken=true&optionsOverride.Scopes=https://graph.microsoft.com/.default").
35-
WithOpenApi(ConfigureOpenAPI);
33+
" ?optionsOverride.RequestAppToken=true&optionsOverride.Scopes=https://graph.microsoft.com/.default");
3634

3735
app.MapPost("/DownstreamApiUnauthenticated/{apiName}", DownstreamApiAsync).
3836
WithName("DownstreamApiUnauthenticated").
@@ -46,20 +44,7 @@ public static void AddDownstreamApiRequestEndpoints(this WebApplication app)
4644
" ?optionsOverride.Scopes=User.Read\n" +
4745
" ?optionsOverride.Scopes=User.Read&optionsOverride.Scopes=Mail.Read\n" +
4846
" ?optionsOverride.AcquireTokenOptions.Tenant=GUID\n" +
49-
" ?optionsOverride.RequestAppToken=true&optionsOverride.Scopes=https://graph.microsoft.com/.default").
50-
WithOpenApi(ConfigureOpenAPI);
51-
}
52-
53-
private static OpenApiOperation ConfigureOpenAPI(OpenApiOperation operation)
54-
{
55-
// Only add once.
56-
var documented = operation.Extensions.ContainsKey("x-optionsOverride-documented");
57-
if (!documented)
58-
{
59-
OpenApiDescriptions.AddOptionsOverrideParameters(operation);
60-
operation.Extensions.Add("x-optionsOverride-documented", new OpenApi.Any.OpenApiBoolean(true));
61-
}
62-
return operation;
47+
" ?optionsOverride.RequestAppToken=true&optionsOverride.Scopes=https://graph.microsoft.com/.default");
6348
}
6449

6550
private static async Task<Results<Ok<DownstreamApiResult>, ProblemHttpResult>> DownstreamApiAsync(
@@ -124,6 +109,13 @@ private static async Task<Results<Ok<DownstreamApiResult>, ProblemHttpResult>> D
124109
detail: ex.InnerException?.Message ?? ex.Message,
125110
statusCode: StatusCodes.Status401Unauthorized);
126111
}
112+
catch (MsalServiceException ex)
113+
{
114+
logger.AuthorizationHeaderAsyncError(ex);
115+
return TypedResults.Problem(
116+
detail: ex.Message,
117+
statusCode: StatusCodes.Status401Unauthorized);
118+
}
127119
catch (Exception ex)
128120
{
129121
logger.AuthorizationHeaderAsyncError(ex);

src/Microsoft.Identity.Web.Sidecar/Endpoints/ValidateRequestEndpoints.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Text.Json;
66
using System.Text.Json.Nodes;
77
using Microsoft.AspNetCore.Http.HttpResults;
8+
using Microsoft.AspNetCore.Mvc;
89
using Microsoft.Identity.Web.Resource;
910
using Microsoft.Identity.Web.Sidecar.Logging;
1011
using Microsoft.Identity.Web.Sidecar.Models;
@@ -24,9 +25,9 @@ public static void AddValidateRequestEndpoints(this WebApplication app)
2425
}
2526

2627
private static Results<Ok<ValidateAuthorizationHeaderResult>, ProblemHttpResult> ValidateEndpoint(
27-
ILogger<Program> logger,
28+
[FromServices] ILogger<Program> logger,
2829
HttpContext httpContext,
29-
IConfiguration configuration)
30+
[FromServices] IConfiguration configuration)
3031
{
3132
string scopeRequiredByApi = configuration["AzureAd:Scopes"] ?? string.Empty;
3233
if (!string.IsNullOrWhiteSpace(scopeRequiredByApi))
Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
<Project Sdk="Microsoft.NET.Sdk.Web">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net9.0</TargetFrameworks>
54
<Nullable>enable</Nullable>
65
<ImplicitUsings>enable</ImplicitUsings>
76
<UserSecretsId>aspnet-Microsoft.Identity.Web.Sidecar-79d2a631-277f-4ef1-9253-4477001378e8</UserSecretsId>
87
<OpenApiDocumentsDirectory>OpenAPI</OpenApiDocumentsDirectory>
98
<GenerateDocumentationFile>False</GenerateDocumentationFile>
109
<IsPackable>false</IsPackable>
1110
<EnablePackageValidation>false</EnablePackageValidation>
11+
<IsAotCompatible>true</IsAotCompatible>
12+
<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
1213
<NoWarn>
1314
$(NoWarn);
1415
<!--RS0016: Add public types and members to the declared API-->
@@ -22,36 +23,33 @@
2223
</NoWarn>
2324
</PropertyGroup>
2425

25-
<!-- Trimming + perf (Release only) -->
2626
<PropertyGroup Condition="'$(Configuration)'=='Release'">
27-
<PublishTrimmed>false</PublishTrimmed>
28-
<TrimMode>partial</TrimMode>
29-
<EnableTrimAnalyzer>false</EnableTrimAnalyzer>
30-
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
3127
<PublishReadyToRun>true</PublishReadyToRun>
32-
<!-- Optional; enable only if you do not rely on culture-specific globalization -->
33-
<!-- <InvariantGlobalization>true</InvariantGlobalization> -->
28+
<!-- Removes globalization-specific code and data -->
29+
<InvariantGlobalization>true</InvariantGlobalization>
30+
<!-- See: https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trimming-options#trim-framework-library-features -->
31+
<!-- Removes code that enables better debugging experiences. This setting also removes symbols. -->
3432
<DebuggerSupport>false</DebuggerSupport>
33+
<!--Removes BinaryFormatter serialization support -->
3534
<EnableUnsafeBinaryFormatterSerialization>false</EnableUnsafeBinaryFormatterSerialization>
36-
<IlcGenerateStackTraceData>false</IlcGenerateStackTraceData>
35+
<!-- Removes support for generating stack traces (for example, Environment.StackTrace or Exception.ToString) by the runtime -->
36+
<StackTraceSupport>false</StackTraceSupport>
3737
</PropertyGroup>
3838

3939
<ItemGroup>
40-
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.9" NoWarn="NU1605" />
41-
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="9.0.9" NoWarn="NU1605" />
42-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.9" />
43-
<PackageReference Include="Microsoft.Extensions.ApiDescription.Server" Version="9.0.9">
40+
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(MicrosoftAspNetCoreAuthenticationJwtBearerVersion)" NoWarn="NU1605" />
41+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="$(MicrosoftAspNetCoreOpenApiVersion)" />
42+
<PackageReference Include="Microsoft.Extensions.ApiDescription.Server" Version="$(MicrosoftExtensionsApiDescriptionServerVersion)">
4443
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
4544
<PrivateAssets>all</PrivateAssets>
4645
</PackageReference>
47-
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
46+
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="$(MicrosoftVisualStudioAzureContainersToolsTargetsVersion)" />
4847
</ItemGroup>
4948

50-
5149
<ItemGroup>
5250
<ProjectReference Include="..\Microsoft.Identity.Web.AgentIdentities\Microsoft.Identity.Web.AgentIdentities.csproj" />
5351
<ProjectReference Include="..\Microsoft.Identity.Web.DownstreamApi\Microsoft.Identity.Web.DownstreamApi.csproj" />
5452
<ProjectReference Include="..\Microsoft.Identity.Web\Microsoft.Identity.Web.csproj" />
5553
</ItemGroup>
5654

57-
</Project>
55+
</Project>

src/Microsoft.Identity.Web.Sidecar/Models/AuthorizationHeaderRequest.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
using System.ComponentModel;
55
using System.Diagnostics.CodeAnalysis;
6-
using System.Text.Json;
7-
using System.Text.Json.Serialization;
86
using Microsoft.AspNetCore.Mvc;
97

108
namespace Microsoft.Identity.Web.Sidecar.Models;

src/Microsoft.Identity.Web.Sidecar/Models/DownstreamApiRequest.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.ComponentModel;
55
using System.Diagnostics.CodeAnalysis;
66
using Microsoft.AspNetCore.Mvc;
7-
using Microsoft.Identity.Abstractions;
87

98
namespace Microsoft.Identity.Web.Sidecar.Models;
109

src/Microsoft.Identity.Web.Sidecar/OptionsOverrideSchemaTransformer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4-
using System.Diagnostics;
54
using Microsoft.AspNetCore.OpenApi;
65
using Microsoft.OpenApi.Models;
76

0 commit comments

Comments
 (0)