Skip to content

Commit bb5abe9

Browse files
authored
Making JWT token audience/issuer validation case insensitive. (#9684)
1 parent 5de363d commit bb5abe9

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/WebJobs.Script.WebHost/Filters/JwtAuthenticationAttribute.cs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using System.Net.Http.Headers;
8-
using System.Text;
98
using System.Threading;
109
using System.Threading.Tasks;
1110
using System.Web.Http.Filters;
@@ -50,8 +49,8 @@ public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationTok
5049
var validationParameters = new TokenValidationParameters()
5150
{
5251
IssuerSigningKeys = signingKeys,
53-
ValidateAudience = true,
54-
ValidateIssuer = true,
52+
AudienceValidator = AudienceValidator,
53+
IssuerValidator = IssuerValidator,
5554
ValidAudiences = new string[]
5655
{
5756
string.Format(SiteAzureFunctionsUriFormat, ScriptSettingsManager.Instance.GetSetting(AzureWebsiteName)),
@@ -76,5 +75,31 @@ public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationTok
7675
}
7776

7877
public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) => Task.CompletedTask;
78+
79+
private static string IssuerValidator(string issuer, SecurityToken securityToken, TokenValidationParameters validationParameters)
80+
{
81+
if (!validationParameters.ValidIssuers.Any(p => string.Equals(issuer, p, StringComparison.OrdinalIgnoreCase)))
82+
{
83+
throw new SecurityTokenInvalidIssuerException("IDX10205: Issuer validation failed.")
84+
{
85+
InvalidIssuer = issuer,
86+
};
87+
}
88+
89+
return issuer;
90+
}
91+
92+
private static bool AudienceValidator(IEnumerable<string> audiences, SecurityToken securityToken, TokenValidationParameters validationParameters)
93+
{
94+
foreach (string audience in audiences)
95+
{
96+
if (validationParameters.ValidAudiences.Any(p => string.Equals(audience, p, StringComparison.OrdinalIgnoreCase)))
97+
{
98+
return true;
99+
}
100+
}
101+
102+
return false;
103+
}
79104
}
80105
}

test/WebJobs.Script.Tests/Filters/JwtAuthenticationAttributeTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public JwtAuthenticationAttributeTests()
5252
[InlineData(nameof(HttpRequestHeader.Authorization), "https://testsite.azurewebsites.net", "https://testsite.azurewebsites.net")]
5353
[InlineData(ScriptConstants.SiteTokenHeaderName)]
5454
[InlineData(ScriptConstants.SiteTokenHeaderName, "https://appservice.core.azurewebsites.net", "https://testsite.azurewebsites.net")]
55+
[InlineData(ScriptConstants.SiteTokenHeaderName, "https://AppService.Core.Azurewebsites.net", "https://TestSite.Azurewebsites.net")]
5556
[InlineData(ScriptConstants.SiteTokenHeaderName, "https://appservice.core.azurewebsites.net", "https://testsite.azurewebsites.net/azurefunctions")]
5657
[InlineData(ScriptConstants.SiteTokenHeaderName, "https://testsite.scm.azurewebsites.net", "https://testsite.azurewebsites.net")]
5758
[InlineData(ScriptConstants.SiteTokenHeaderName, "https://testsite.scm.azurewebsites.net", "https://testsite.azurewebsites.net/azurefunctions")]

0 commit comments

Comments
 (0)