Skip to content

Commit 6a8bc55

Browse files
safihamidfabiocav
authored andcommitted
Proxies redirecting to local function will return 401 if local function is not anonymou
#3489
1 parent 494f676 commit 6a8bc55

File tree

7 files changed

+68
-12
lines changed

7 files changed

+68
-12
lines changed

src/WebJobs.Script.WebHost/Middleware/FunctionInvocationMiddleware.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,16 +186,23 @@ private void PopulateRouteData(HttpContext context)
186186

187187
private async Task<bool> AuthenticateAndAuthorizeAsync(HttpContext context, FunctionDescriptor descriptor)
188188
{
189-
var policyEvaluator = context.RequestServices.GetRequiredService<IPolicyEvaluator>();
190-
AuthorizationPolicy policy = AuthUtility.CreateFunctionPolicy();
189+
if (!descriptor.Metadata.IsProxy)
190+
{
191+
var policyEvaluator = context.RequestServices.GetRequiredService<IPolicyEvaluator>();
192+
AuthorizationPolicy policy = AuthUtility.CreateFunctionPolicy();
191193

192-
// Authenticate the request
193-
var authenticateResult = await policyEvaluator.AuthenticateAsync(policy, context);
194+
// Authenticate the request
195+
var authenticateResult = await policyEvaluator.AuthenticateAsync(policy, context);
194196

195-
// Authorize using the function policy and resource
196-
var authorizeResult = await policyEvaluator.AuthorizeAsync(policy, authenticateResult, context, descriptor);
197+
// Authorize using the function policy and resource
198+
var authorizeResult = await policyEvaluator.AuthorizeAsync(policy, authenticateResult, context, descriptor);
197199

198-
return authorizeResult.Succeeded;
200+
return authorizeResult.Succeeded;
201+
}
202+
else
203+
{
204+
return true;
205+
}
199206
}
200207

201208
internal static void SetRequestId(HttpRequest request)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"bindings": [
3+
{
4+
"authLevel": "function",
5+
"name": "req",
6+
"type": "httpTrigger",
7+
"direction": "in"
8+
},
9+
{
10+
"name": "$return",
11+
"type": "http",
12+
"direction": "out"
13+
}
14+
],
15+
"disabled": false
16+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
public static string Run(HttpRequestMessage req) => "Pong";

test/WebJobs.Script.Tests.Integration/TestScripts/Proxies/proxies.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@
4949
"backend.request.headers.accept": "text/plain"
5050
}
5151
},
52+
"LocalFunctionCallWithAuth": {
53+
"matchCondition": {
54+
"methods": [
55+
"GET"
56+
],
57+
"route": "/myhttptriggerauth"
58+
},
59+
"backendUri": "https://localhost/api/PingAuth",
60+
"requestOverrides": {
61+
"backend.request.headers.accept": "text/plain"
62+
}
63+
},
5264
"LongRoute": {
5365
"matchCondition": {
5466
"route": "/test123412341234123412341234123412341234123412341234123412341234123412341234123421341234123423141234123412341234123412341234123412341234123412341234123412341234123412341234123412341234213423141234123412341234123412341234123412341234123412341234123412341234123412341234123412341234"

test/WebJobs.Script.Tests.Integration/WebHostEndToEnd/ProxyEndToEndTests.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Microsoft.Extensions.DependencyInjection;
1919
using Microsoft.Extensions.DependencyInjection.Extensions;
2020
using Microsoft.Extensions.Options;
21+
using Moq;
2122
using Xunit;
2223

2324
namespace Microsoft.Azure.WebJobs.Script.Tests
@@ -43,7 +44,7 @@ public async Task ListFunctions_Proxies_Succeeds()
4344
var response = await _fixture.HttpClient.SendAsync(request);
4445
var metadata = (await response.Content.ReadAsAsync<IEnumerable<FunctionMetadataResponse>>()).ToArray();
4546

46-
Assert.Equal(18, metadata.Length);
47+
Assert.Equal(20, metadata.Length);
4748
var function = metadata.Single(p => p.Name == "PingRoute");
4849
Assert.Equal("https://localhost/myroute/mysubroute", function.InvokeUrlTemplate.AbsoluteUri);
4950

@@ -60,7 +61,7 @@ public async Task ListFunctions_Proxies_Succeeds()
6061
response = await _fixture.HttpClient.SendAsync(request);
6162
metadata = (await response.Content.ReadAsAsync<IEnumerable<FunctionMetadataResponse>>()).ToArray();
6263
Assert.False(metadata.Any(p => p.IsProxy));
63-
Assert.Equal(2, metadata.Length);
64+
Assert.Equal(3, metadata.Length);
6465
}
6566

6667
[Fact]
@@ -109,6 +110,18 @@ public async Task LocalFunctionCall()
109110
Assert.Equal("Pong", content);
110111
}
111112

113+
[Fact]
114+
public async Task LocalFunctionCallWithAuth()
115+
{
116+
string functionKey = await _fixture.GetFunctionSecretAsync("PingAuth");
117+
118+
HttpResponseMessage response = await _fixture.HttpClient.GetAsync($"myhttptriggerauth?code={functionKey}");
119+
120+
string content = await response.Content.ReadAsStringAsync();
121+
Assert.Equal("200", response.StatusCode.ToString("D"));
122+
Assert.Equal("Pong", content);
123+
}
124+
112125
[Fact]
113126
public async Task LocalFunctionInfiniteRedirectTest()
114127
{
@@ -341,6 +354,13 @@ public TestFixture()
341354
TestHelpers.WaitForWebHost(HttpClient);
342355
}
343356

357+
public async Task<string> GetFunctionSecretAsync(string functionName)
358+
{
359+
var secretManager = _testServer.Host.Services.GetService<ISecretManagerProvider>().Current;
360+
var secrets = await secretManager.GetFunctionSecretsAsync(functionName);
361+
return secrets.First().Value;
362+
}
363+
344364
public ScriptApplicationHostOptions HostOptions { get; private set; }
345365

346366
public HttpClient HttpClient { get; set; }

test/WebJobs.Script.Tests.Shared/TestSecretManager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public virtual Task<IDictionary<string, string>> GetFunctionSecretsAsync(string
2626
{
2727
return Task.FromResult<IDictionary<string, string>>(new Dictionary<string, string>
2828
{
29-
{ "Key1", "Value1" },
30-
{ "Key2", "Value2" },
29+
{ "Key1", $"{functionName}1".ToLowerInvariant() },
30+
{ "Key2", $"{functionName}2".ToLowerInvariant() },
3131
});
3232
}
3333

test/WebJobs.Script.Tests/ProxyMetadataManagerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void ProxyMetadata_WhenProxyFileChanges_IsRefreshed()
4848

4949
Assert.NotSame(proxyMetadata1, proxyMetadata3);
5050

51-
Assert.Equal(16, proxyMetadata3.Functions.Length);
51+
Assert.Equal(17, proxyMetadata3.Functions.Length);
5252
}
5353
}
5454
}

0 commit comments

Comments
 (0)