Skip to content

Commit 788711e

Browse files
authored
Remove Auth validation when Form File upload (#42586)
* Remove Auth validation when Form * Updating unit tests
1 parent 62c8f16 commit 788711e

File tree

2 files changed

+27
-65
lines changed

2 files changed

+27
-65
lines changed

src/Http/Http.Extensions/src/RequestDelegateFactory.cs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,8 +1239,6 @@ private static Expression AddResponseWritingToMethodCall(Expression methodCall,
12391239
return (null, false);
12401240
}
12411241

1242-
ThrowIfRequestIsAuthenticated(httpContext);
1243-
12441242
try
12451243
{
12461244
formValue = await httpContext.Request.ReadFormAsync();
@@ -1260,33 +1258,6 @@ private static Expression AddResponseWritingToMethodCall(Expression methodCall,
12601258

12611259
return (formValue, true);
12621260
}
1263-
1264-
static void ThrowIfRequestIsAuthenticated(HttpContext httpContext)
1265-
{
1266-
if (httpContext.Connection.ClientCertificate is not null)
1267-
{
1268-
throw new BadHttpRequestException(
1269-
"Support for binding parameters from an HTTP request's form is not currently supported " +
1270-
"if the request is associated with a client certificate. Use of an HTTP request form is " +
1271-
"not currently secure for HTTP requests in scenarios which require authentication.");
1272-
}
1273-
1274-
if (!StringValues.IsNullOrEmpty(httpContext.Request.Headers.Authorization))
1275-
{
1276-
throw new BadHttpRequestException(
1277-
"Support for binding parameters from an HTTP request's form is not currently supported " +
1278-
"if the request contains an \"Authorization\" HTTP request header. Use of an HTTP request form is " +
1279-
"not currently secure for HTTP requests in scenarios which require authentication.");
1280-
}
1281-
1282-
if (!StringValues.IsNullOrEmpty(httpContext.Request.Headers.Cookie))
1283-
{
1284-
throw new BadHttpRequestException(
1285-
"Support for binding parameters from an HTTP request's form is not currently supported " +
1286-
"if the request contains a \"Cookie\" HTTP request header. Use of an HTTP request form is " +
1287-
"not currently secure for HTTP requests in scenarios which require authentication.");
1288-
}
1289-
}
12901261
}
12911262

12921263
private static Expression GetValueFromProperty(MemberExpression sourceExpression, PropertyInfo itemProperty, string key, Type? returnType = null)

src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4479,18 +4479,19 @@ void TestAction(IFormFileCollection formFiles, IFormFile file)
44794479
}
44804480

44814481
[Theory]
4482-
[InlineData("Authorization", "bearer my-token", "Support for binding parameters from an HTTP request's form is not currently supported if the request contains an \"Authorization\" HTTP request header. Use of an HTTP request form is not currently secure for HTTP requests in scenarios which require authentication.")]
4483-
[InlineData("Cookie", ".AspNetCore.Auth=abc123", "Support for binding parameters from an HTTP request's form is not currently supported if the request contains a \"Cookie\" HTTP request header. Use of an HTTP request form is not currently secure for HTTP requests in scenarios which require authentication.")]
4484-
public async Task RequestDelegateThrowsIfRequestUsingFormContainsSecureHeader(
4482+
[InlineData("Authorization", "bearer my-token")]
4483+
[InlineData("Cookie", ".AspNetCore.Auth=abc123")]
4484+
public async Task RequestDelegatePopulatesFromIFormFileParameterIfRequestContainsSecureHeader(
44854485
string headerName,
4486-
string headerValue,
4487-
string expectedMessage)
4486+
string headerValue)
44884487
{
4489-
var invoked = false;
4488+
IFormFile? fileArgument = null;
4489+
TraceIdentifier traceIdArgument = default;
44904490

4491-
void TestAction(IFormFile file)
4491+
void TestAction(IFormFile? file, TraceIdentifier traceId)
44924492
{
4493-
invoked = true;
4493+
fileArgument = file;
4494+
traceIdArgument = traceId;
44944495
}
44954496

44964497
var fileContent = new StringContent("hello", Encoding.UTF8, "application/octet-stream");
@@ -4507,34 +4508,30 @@ void TestAction(IFormFile file)
45074508
httpContext.Request.Headers[headerName] = headerValue;
45084509
httpContext.Request.Headers["Content-Type"] = "multipart/form-data;boundary=some-boundary";
45094510
httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));
4511+
httpContext.TraceIdentifier = "my-trace-id";
45104512

45114513
var factoryResult = RequestDelegateFactory.Create(TestAction);
45124514
var requestDelegate = factoryResult.RequestDelegate;
45134515

4514-
var badHttpRequestException = await Assert.ThrowsAsync<BadHttpRequestException>(() => requestDelegate(httpContext));
4515-
4516-
Assert.False(invoked);
4517-
4518-
// The httpContext should be untouched.
4519-
Assert.False(httpContext.RequestAborted.IsCancellationRequested);
4520-
Assert.Equal(200, httpContext.Response.StatusCode);
4521-
Assert.False(httpContext.Response.HasStarted);
4516+
await requestDelegate(httpContext);
45224517

4523-
// We don't log bad requests when we throw.
4524-
Assert.Empty(TestSink.Writes);
4518+
Assert.Equal(httpContext.Request.Form.Files["file"], fileArgument);
4519+
Assert.Equal("file.txt", fileArgument!.FileName);
4520+
Assert.Equal("file", fileArgument.Name);
45254521

4526-
Assert.Equal(expectedMessage, badHttpRequestException.Message);
4527-
Assert.Equal(400, badHttpRequestException.StatusCode);
4522+
Assert.Equal("my-trace-id", traceIdArgument.Id);
45284523
}
45294524

45304525
[Fact]
4531-
public async Task RequestDelegateThrowsIfRequestUsingFormHasClientCertificate()
4526+
public async Task RequestDelegatePopulatesFromIFormFileParameterIfRequestHasClientCertificate()
45324527
{
4533-
var invoked = false;
4528+
IFormFile? fileArgument = null;
4529+
TraceIdentifier traceIdArgument = default;
45344530

4535-
void TestAction(IFormFile file)
4531+
void TestAction(IFormFile? file, TraceIdentifier traceId)
45364532
{
4537-
invoked = true;
4533+
fileArgument = file;
4534+
traceIdArgument = traceId;
45384535
}
45394536

45404537
var fileContent = new StringContent("hello", Encoding.UTF8, "application/octet-stream");
@@ -4550,6 +4547,7 @@ void TestAction(IFormFile file)
45504547
httpContext.Request.Body = stream;
45514548
httpContext.Request.Headers["Content-Type"] = "multipart/form-data;boundary=some-boundary";
45524549
httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));
4550+
httpContext.TraceIdentifier = "my-trace-id";
45534551

45544552
#pragma warning disable SYSLIB0026 // Type or member is obsolete
45554553
var clientCertificate = new X509Certificate2();
@@ -4560,20 +4558,13 @@ void TestAction(IFormFile file)
45604558
var factoryResult = RequestDelegateFactory.Create(TestAction);
45614559
var requestDelegate = factoryResult.RequestDelegate;
45624560

4563-
var badHttpRequestException = await Assert.ThrowsAsync<BadHttpRequestException>(() => requestDelegate(httpContext));
4564-
4565-
Assert.False(invoked);
4566-
4567-
// The httpContext should be untouched.
4568-
Assert.False(httpContext.RequestAborted.IsCancellationRequested);
4569-
Assert.Equal(200, httpContext.Response.StatusCode);
4570-
Assert.False(httpContext.Response.HasStarted);
4561+
await requestDelegate(httpContext);
45714562

4572-
// We don't log bad requests when we throw.
4573-
Assert.Empty(TestSink.Writes);
4563+
Assert.Equal(httpContext.Request.Form.Files["file"], fileArgument);
4564+
Assert.Equal("file.txt", fileArgument!.FileName);
4565+
Assert.Equal("file", fileArgument.Name);
45744566

4575-
Assert.Equal("Support for binding parameters from an HTTP request's form is not currently supported if the request is associated with a client certificate. Use of an HTTP request form is not currently secure for HTTP requests in scenarios which require authentication.", badHttpRequestException.Message);
4576-
Assert.Equal(400, badHttpRequestException.StatusCode);
4567+
Assert.Equal("my-trace-id", traceIdArgument.Id);
45774568
}
45784569

45794570
private record struct ParameterListRecordStruct(HttpContext HttpContext, [FromRoute] int Value);

0 commit comments

Comments
 (0)