Skip to content

Support forwarded headers in servers URL resolution #60725

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from

Conversation

captainsafia
Copy link
Member

Follow-up to #60673 for supporting forwarded headers.

@Copilot Copilot AI review requested due to automatic review settings March 3, 2025 20:41
@captainsafia captainsafia requested a review from a team as a code owner March 3, 2025 20:41
@ghost ghost added the area-mvc Includes: MVC, Actions and Controllers, Localization, CORS, most templates label Mar 3, 2025
@captainsafia captainsafia added feature-openapi area-minimal Includes minimal APIs, endpoint filters, parameter binding, request delegate generator etc labels Mar 3, 2025
Copy link
Contributor

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

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

PR Overview

The PR introduces support for forwarded headers in the URL resolution logic for OpenAPI servers.

  • Added new test cases to verify the behavior when forwarded headers are provided.
  • Updated OpenApiDocumentService to extract the forwarded scheme and host from request headers.

Reviewed Changes

File Description
src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Servers.cs Added tests to validate forwarded header support.
src/OpenApi/src/Services/OpenApiDocumentService.cs Modified server URL construction to handle forwarded headers.

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/OpenApi/src/Services/OpenApiDocumentService.cs:209

  • [nitpick] Consider adding test cases for scenarios where the 'X-Forwarded-Proto' header contains multiple values to verify that the current extraction logic meets all expected use cases.
var scheme = httpRequest.Headers.GetCommaSeparatedValues("X-Forwarded-Proto") is [var forwardedScheme, ..] ? forwardedScheme : httpRequest.Scheme;

@@ -205,14 +205,26 @@ internal List<OpenApiServer> GetOpenApiServers(HttpRequest? httpRequest = null)
{
if (httpRequest is not null)
{
var serverUrl = UriHelper.BuildAbsolute(httpRequest.Scheme, httpRequest.Host, httpRequest.PathBase);
// Handle forwarded headers directly if present
var scheme = httpRequest.Headers.GetCommaSeparatedValues("X-Forwarded-Proto") is [var forwardedScheme, ..]
Copy link
Member

Choose a reason for hiding this comment

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

Why is this happening in the document service? We have a whole middleware for forwarded headers

Copy link
Member Author

Choose a reason for hiding this comment

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

We can't always rely on the forwarded headers middleware being enabled for this feature to work --especially since the training people are used to is that OpenAPI operates independent of any other options.

There's also some local dev scenarios (Codespaces, for example) that make it hard to discover that you need to enable forwarded headers middleware.

Copy link
Member

Choose a reason for hiding this comment

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

That applies to all of asp.net core, not this feature. There are also security concerns with blindly reading xff headers (the middleware goes through great lengths to make that configurable but secure by default). You can (as a customer) enable his flag ASPNETCORE_FORWARDEDHEADERS_ENABLED, to turn on the middleware from the outside.

The custom should be using one of those techniques. This middleware is no more special than the rest.

Copy link
Member Author

Choose a reason for hiding this comment

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

Lucky for you I don't feel argumentative today. 😆 I'll close this PR out and make the same change in the servicing PR.

@dotnet-policy-service dotnet-policy-service bot added this to the 10.0-preview3 milestone Mar 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-minimal Includes minimal APIs, endpoint filters, parameter binding, request delegate generator etc area-mvc Includes: MVC, Actions and Controllers, Localization, CORS, most templates feature-openapi
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants