13
13
using Microsoft . Azure . WebJobs . Script . Workers . Rpc ;
14
14
using Microsoft . Extensions . DependencyInjection ;
15
15
using Microsoft . Extensions . DependencyInjection . Extensions ;
16
+ using Microsoft . Extensions . Logging ;
16
17
using Xunit ;
17
18
18
19
namespace Microsoft . Azure . WebJobs . Script . Tests . Integration . WebHostEndToEnd
@@ -38,6 +39,7 @@ public JwtTokenAuthTests(TestFixture fixture)
38
39
[ InlineData ( nameof ( HttpRequestHeader . Authorization ) , "https://testsite.azurewebsites.net" , "https://testsite.azurewebsites.net" ) ]
39
40
[ InlineData ( ScriptConstants . SiteTokenHeaderName ) ]
40
41
[ InlineData ( ScriptConstants . SiteTokenHeaderName , "https://appservice.core.azurewebsites.net" , "https://testsite.azurewebsites.net" ) ]
42
+ [ InlineData ( ScriptConstants . SiteTokenHeaderName , "https://AppService.Core.Azurewebsites.net" , "https://TestSite.Azurewebsites.net" ) ]
41
43
[ InlineData ( ScriptConstants . SiteTokenHeaderName , "https://appservice.core.azurewebsites.net" , "https://testsite.azurewebsites.net/azurefunctions" ) ]
42
44
[ InlineData ( ScriptConstants . SiteTokenHeaderName , "https://testsite.scm.azurewebsites.net" , "https://testsite.azurewebsites.net" ) ]
43
45
[ InlineData ( ScriptConstants . SiteTokenHeaderName , "https://testsite.scm.azurewebsites.net" , "https://testsite.azurewebsites.net/azurefunctions" ) ]
@@ -63,10 +65,10 @@ public async Task InvokeAdminApi_ValidToken_Succeeds(string headerName, string i
63
65
[ Theory ]
64
66
[ InlineData ( nameof ( HttpRequestHeader . Authorization ) ) ]
65
67
[ InlineData ( ScriptConstants . SiteTokenHeaderName ) ]
66
- public async Task InvokeAdminApi_InvalidToken_Fails ( string headerName )
68
+ public async Task InvokeAdminApi_InvalidAudience_Fails ( string headerName )
67
69
{
68
70
HttpRequestMessage request = new HttpRequestMessage ( HttpMethod . Get , "admin/host/status" ) ;
69
- string token = _fixture . Host . GenerateAdminJwtToken ( "invalid" , "invalid" ) ;
71
+ string token = _fixture . Host . GenerateAdminJwtToken ( audience : "invalid" ) ;
70
72
71
73
if ( string . Compare ( nameof ( HttpRequestHeader . Authorization ) , headerName ) == 0 )
72
74
{
@@ -77,8 +79,73 @@ public async Task InvokeAdminApi_InvalidToken_Fails(string headerName)
77
79
request . Headers . Add ( headerName , token ) ;
78
80
}
79
81
82
+ _fixture . Host . ClearLogMessages ( ) ;
83
+
80
84
var response = await _fixture . Host . HttpClient . SendAsync ( request ) ;
81
85
Assert . Equal ( HttpStatusCode . Unauthorized , response . StatusCode ) ;
86
+
87
+ var validationError = _fixture . Host . GetScriptHostLogMessages ( ) . Single ( p => p . Level == LogLevel . Error ) ;
88
+ Assert . Equal ( ScriptConstants . LogCategoryHostAuthentication , validationError . Category ) ;
89
+ Assert . Equal ( "Token audience validation failed for audience 'invalid'." , validationError . FormattedMessage ) ;
90
+ Assert . True ( validationError . Exception . Message . StartsWith ( "IDX10231: Audience validation failed." ) ) ;
91
+ }
92
+
93
+ [ Theory ]
94
+ [ InlineData ( nameof ( HttpRequestHeader . Authorization ) ) ]
95
+ [ InlineData ( ScriptConstants . SiteTokenHeaderName ) ]
96
+ public async Task InvokeAdminApi_InvalidIssuer_Fails ( string headerName )
97
+ {
98
+ HttpRequestMessage request = new HttpRequestMessage ( HttpMethod . Get , "admin/host/status" ) ;
99
+ string token = _fixture . Host . GenerateAdminJwtToken ( issuer : "invalid" ) ;
100
+
101
+ if ( string . Compare ( nameof ( HttpRequestHeader . Authorization ) , headerName ) == 0 )
102
+ {
103
+ request . Headers . Authorization = new AuthenticationHeaderValue ( "Bearer" , token ) ;
104
+ }
105
+ else
106
+ {
107
+ request . Headers . Add ( headerName , token ) ;
108
+ }
109
+
110
+ _fixture . Host . ClearLogMessages ( ) ;
111
+
112
+ var response = await _fixture . Host . HttpClient . SendAsync ( request ) ;
113
+ Assert . Equal ( HttpStatusCode . Unauthorized , response . StatusCode ) ;
114
+
115
+ var validationError = _fixture . Host . GetScriptHostLogMessages ( ) . Single ( p => p . Level == LogLevel . Error ) ;
116
+ Assert . Equal ( ScriptConstants . LogCategoryHostAuthentication , validationError . Category ) ;
117
+ Assert . Equal ( "Token issuer validation failed for issuer 'invalid'." , validationError . FormattedMessage ) ;
118
+ Assert . Equal ( "IDX10205: Issuer validation failed." , validationError . Exception . Message ) ;
119
+ }
120
+
121
+ [ Theory ]
122
+ [ InlineData ( nameof ( HttpRequestHeader . Authorization ) ) ]
123
+ [ InlineData ( ScriptConstants . SiteTokenHeaderName ) ]
124
+ public async Task InvokeAdminApi_InvalidSignature_Fails ( string headerName )
125
+ {
126
+ HttpRequestMessage request = new HttpRequestMessage ( HttpMethod . Get , "admin/host/status" ) ;
127
+
128
+ byte [ ] keyBytes = TestHelpers . GenerateKeyBytes ( ) ;
129
+ string token = _fixture . Host . GenerateAdminJwtToken ( key : keyBytes ) ;
130
+
131
+ if ( string . Compare ( nameof ( HttpRequestHeader . Authorization ) , headerName ) == 0 )
132
+ {
133
+ request . Headers . Authorization = new AuthenticationHeaderValue ( "Bearer" , token ) ;
134
+ }
135
+ else
136
+ {
137
+ request . Headers . Add ( headerName , token ) ;
138
+ }
139
+
140
+ _fixture . Host . ClearLogMessages ( ) ;
141
+
142
+ var response = await _fixture . Host . HttpClient . SendAsync ( request ) ;
143
+ Assert . Equal ( HttpStatusCode . Unauthorized , response . StatusCode ) ;
144
+
145
+ var validationError = _fixture . Host . GetScriptHostLogMessages ( ) . Single ( p => p . Level == LogLevel . Error ) ;
146
+ Assert . Equal ( ScriptConstants . LogCategoryHostAuthentication , validationError . Category ) ;
147
+ Assert . Equal ( "Token validation failed." , validationError . FormattedMessage ) ;
148
+ Assert . True ( validationError . Exception . Message . StartsWith ( "IDX10503: Signature validation failed." ) ) ;
82
149
}
83
150
84
151
[ Fact ]
0 commit comments