Skip to content

Commit 72ae629

Browse files
authored
Adding runtime site name to valid JWT audiences (slot scenarios). (#10183)
1 parent 84c28db commit 72ae629

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

src/WebJobs.Script.WebHost/Security/Authentication/Jwt/ScriptJwtBearerExtensions.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public static AuthenticationBuilder AddScriptJwtBearer(this AuthenticationBuilde
8686
}
8787
});
8888

89-
private static string[] GetValidAudiences()
89+
private static IEnumerable<string> GetValidAudiences()
9090
{
9191
if (SystemEnvironment.Instance.IsPlaceholderModeEnabled())
9292
{
@@ -106,11 +106,22 @@ private static string[] GetValidAudiences()
106106
}
107107
}
108108

109-
return new string[]
109+
string siteName = ScriptSettingsManager.Instance.GetSetting(AzureWebsiteName);
110+
string runtimeSiteName = ScriptSettingsManager.Instance.GetSetting(AzureWebsiteRuntimeSiteName);
111+
var audiences = new List<string>
110112
{
111-
string.Format(SiteAzureFunctionsUriFormat, ScriptSettingsManager.Instance.GetSetting(AzureWebsiteName)),
112-
string.Format(SiteUriFormat, ScriptSettingsManager.Instance.GetSetting(AzureWebsiteName))
113+
string.Format(SiteAzureFunctionsUriFormat, siteName),
114+
string.Format(SiteUriFormat, siteName)
113115
};
116+
117+
if (!string.IsNullOrEmpty(runtimeSiteName) && !string.Equals(siteName, runtimeSiteName, StringComparison.OrdinalIgnoreCase))
118+
{
119+
// on a non-production slot, the runtime site name will differ from the site name
120+
// we allow both for audience
121+
audiences.Add(string.Format(SiteUriFormat, runtimeSiteName));
122+
}
123+
124+
return audiences;
114125
}
115126

116127
public static TokenValidationParameters CreateTokenValidationParameters()

test/WebJobs.Script.Tests/Extensions/ScriptJwtBearerExtensionsTests.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class ScriptJwtBearerExtensionsTests
1818
[InlineData(true, false)]
1919
[InlineData(false, true)]
2020
[InlineData(false, false)]
21-
public void CreateTokenValidationParameters_HasExpectedAudience(bool isPlaceholderModeEnabled, bool isLinuxConsumptionOnLegion)
21+
public void CreateTokenValidationParameters_HasExpectedAudiences(bool isPlaceholderModeEnabled, bool isLinuxConsumptionOnLegion)
2222
{
2323
var podName = "RandomPodName";
2424
var containerName = "RandomContainerName";
@@ -82,5 +82,43 @@ public void CreateTokenValidationParameters_HasExpectedAudience(bool isPlacehold
8282
}
8383
}
8484
}
85+
86+
[Theory]
87+
[InlineData("testsite", "testsite")]
88+
[InlineData("testsite", "testsite__5bb5")]
89+
[InlineData("testsite", null)]
90+
[InlineData("testsite", "")]
91+
public void CreateTokenValidationParameters_NonProductionSlot_HasExpectedAudiences(string siteName, string runtimeSiteName)
92+
{
93+
string azFuncAudience = string.Format(ScriptConstants.SiteAzureFunctionsUriFormat, siteName);
94+
string siteAudience = string.Format(ScriptConstants.SiteUriFormat, siteName);
95+
string runtimeSiteAudience = string.Format(ScriptConstants.SiteUriFormat, runtimeSiteName);
96+
97+
var testEnv = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
98+
{
99+
{ EnvironmentSettingNames.AzureWebsiteName, siteName },
100+
{ EnvironmentSettingNames.AzureWebsiteRuntimeSiteName, runtimeSiteName },
101+
{ ContainerEncryptionKey, Convert.ToBase64String(TestHelpers.GenerateKeyBytes()) }
102+
};
103+
104+
using (new TestScopedSettings(ScriptSettingsManager.Instance, testEnv))
105+
{
106+
var tokenValidationParameters = ScriptJwtBearerExtensions.CreateTokenValidationParameters();
107+
var audiences = tokenValidationParameters.ValidAudiences.ToArray();
108+
109+
Assert.Equal(audiences[0], azFuncAudience);
110+
Assert.Equal(audiences[1], siteAudience);
111+
112+
if (string.Compare(siteName, runtimeSiteName, StringComparison.OrdinalIgnoreCase) == 0)
113+
{
114+
Assert.Equal(2, audiences.Length);
115+
}
116+
else if (!string.IsNullOrEmpty(runtimeSiteName))
117+
{
118+
Assert.Equal(3, audiences.Length);
119+
Assert.Equal(audiences[2], runtimeSiteAudience);
120+
}
121+
}
122+
}
85123
}
86124
}

0 commit comments

Comments
 (0)