Skip to content

Commit f3c64e7

Browse files
authored
Adding runtime site name to valid JWT audiences (slot scenarios). (#10186)
1 parent 23e71b5 commit f3c64e7

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
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
&& SystemEnvironment.Instance.IsLinuxConsumptionOnAtlas())
@@ -97,11 +97,22 @@ private static string[] GetValidAudiences()
9797
};
9898
}
9999

100-
return new string[]
100+
string siteName = ScriptSettingsManager.Instance.GetSetting(AzureWebsiteName);
101+
string runtimeSiteName = ScriptSettingsManager.Instance.GetSetting(AzureWebsiteRuntimeSiteName);
102+
var audiences = new List<string>
101103
{
102-
string.Format(SiteAzureFunctionsUriFormat, ScriptSettingsManager.Instance.GetSetting(AzureWebsiteName)),
103-
string.Format(SiteUriFormat, ScriptSettingsManager.Instance.GetSetting(AzureWebsiteName))
104+
string.Format(SiteAzureFunctionsUriFormat, siteName),
105+
string.Format(SiteUriFormat, siteName)
104106
};
107+
108+
if (!string.IsNullOrEmpty(runtimeSiteName) && !string.Equals(siteName, runtimeSiteName, StringComparison.OrdinalIgnoreCase))
109+
{
110+
// on a non-production slot, the runtime site name will differ from the site name
111+
// we allow both for audience
112+
audiences.Add(string.Format(SiteUriFormat, runtimeSiteName));
113+
}
114+
115+
return audiences;
105116
}
106117

107118
public static TokenValidationParameters CreateTokenValidationParameters()

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,43 @@ public void CreateTokenValidationParameters_HasExpectedAudience(bool isPlacehold
6767
}
6868
}
6969
}
70+
71+
[Theory]
72+
[InlineData("testsite", "testsite")]
73+
[InlineData("testsite", "testsite__5bb5")]
74+
[InlineData("testsite", null)]
75+
[InlineData("testsite", "")]
76+
public void CreateTokenValidationParameters_NonProductionSlot_HasExpectedAudiences(string siteName, string runtimeSiteName)
77+
{
78+
string azFuncAudience = string.Format(ScriptConstants.SiteAzureFunctionsUriFormat, siteName);
79+
string siteAudience = string.Format(ScriptConstants.SiteUriFormat, siteName);
80+
string runtimeSiteAudience = string.Format(ScriptConstants.SiteUriFormat, runtimeSiteName);
81+
82+
var testEnv = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
83+
{
84+
{ EnvironmentSettingNames.AzureWebsiteName, siteName },
85+
{ EnvironmentSettingNames.AzureWebsiteRuntimeSiteName, runtimeSiteName },
86+
{ ContainerEncryptionKey, Convert.ToBase64String(TestHelpers.GenerateKeyBytes()) }
87+
};
88+
89+
using (new TestScopedSettings(ScriptSettingsManager.Instance, testEnv))
90+
{
91+
var tokenValidationParameters = ScriptJwtBearerExtensions.CreateTokenValidationParameters();
92+
var audiences = tokenValidationParameters.ValidAudiences.ToArray();
93+
94+
Assert.Equal(audiences[0], azFuncAudience);
95+
Assert.Equal(audiences[1], siteAudience);
96+
97+
if (string.Compare(siteName, runtimeSiteName, StringComparison.OrdinalIgnoreCase) == 0)
98+
{
99+
Assert.Equal(2, audiences.Length);
100+
}
101+
else if (!string.IsNullOrEmpty(runtimeSiteName))
102+
{
103+
Assert.Equal(3, audiences.Length);
104+
Assert.Equal(audiences[2], runtimeSiteAudience);
105+
}
106+
}
107+
}
70108
}
71109
}

0 commit comments

Comments
 (0)