1- using System . Net ;
1+ using System ;
2+ using System . Net ;
23using System . Net . Http ;
34using System . Web . Http ;
45using System . Web . Http . Controllers ;
@@ -14,8 +15,12 @@ namespace WebJobs.Script.Tests
1415 public class AuthorizationLevelAttributeTests
1516 {
1617 private readonly string TestMasterKeyValue = "abc123" ;
18+ private readonly string TestFunctionKeyValue = "def456" ;
19+ private readonly string TestHostFunctionKeyValue = "xyz789" ;
1720 private HttpActionContext _actionContext ;
1821 private HostSecrets _hostSecrets ;
22+ private FunctionSecrets _functionSecrets ;
23+ private Mock < SecretManager > _mockSecretManager ;
1924
2025 public AuthorizationLevelAttributeTests ( )
2126 {
@@ -26,13 +31,19 @@ public AuthorizationLevelAttributeTests()
2631 controllerContext . Configuration = httpConfig ;
2732 Mock < IDependencyResolver > mockDependencyResolver = new Mock < IDependencyResolver > ( MockBehavior . Strict ) ;
2833 httpConfig . DependencyResolver = mockDependencyResolver . Object ;
29- Mock < SecretManager > mockSecretManager = new Mock < SecretManager > ( MockBehavior . Strict ) ;
34+ _mockSecretManager = new Mock < SecretManager > ( MockBehavior . Strict ) ;
3035 _hostSecrets = new HostSecrets
3136 {
32- MasterKey = TestMasterKeyValue
37+ MasterKey = TestMasterKeyValue ,
38+ FunctionKey = TestHostFunctionKeyValue
3339 } ;
34- mockSecretManager . Setup ( p => p . GetHostSecrets ( ) ) . Returns ( _hostSecrets ) ;
35- mockDependencyResolver . Setup ( p => p . GetService ( typeof ( SecretManager ) ) ) . Returns ( mockSecretManager . Object ) ;
40+ _mockSecretManager . Setup ( p => p . GetHostSecrets ( ) ) . Returns ( _hostSecrets ) ;
41+ _functionSecrets = new FunctionSecrets
42+ {
43+ Key = TestFunctionKeyValue
44+ } ;
45+ _mockSecretManager . Setup ( p => p . GetFunctionSecrets ( It . IsAny < string > ( ) ) ) . Returns ( _functionSecrets ) ;
46+ mockDependencyResolver . Setup ( p => p . GetService ( typeof ( SecretManager ) ) ) . Returns ( _mockSecretManager . Object ) ;
3647 }
3748
3849 [ Fact ]
@@ -41,7 +52,7 @@ public void OnAuthorization_AdminLevel_ValidHeader_Succeeds()
4152 AuthorizationLevelAttribute attribute = new AuthorizationLevelAttribute ( AuthorizationLevel . Admin ) ;
4253
4354 HttpRequestMessage request = new HttpRequestMessage ( ) ;
44- request . Headers . Add ( AuthorizationLevelAttribute . MasterKeyHeaderName , "abc123" ) ;
55+ request . Headers . Add ( AuthorizationLevelAttribute . FunctionsKeyHeaderName , "abc123" ) ;
4556 _actionContext . ControllerContext . Request = request ;
4657
4758 attribute . OnAuthorization ( _actionContext ) ;
@@ -60,7 +71,7 @@ public void OnAuthorization_AdminLevel_InvalidHeader_ReturnsUnauthorized(string
6071 HttpRequestMessage request = new HttpRequestMessage ( ) ;
6172 if ( headerValue != null )
6273 {
63- request . Headers . Add ( AuthorizationLevelAttribute . MasterKeyHeaderName , headerValue ) ;
74+ request . Headers . Add ( AuthorizationLevelAttribute . FunctionsKeyHeaderName , headerValue ) ;
6475 }
6576 _actionContext . ControllerContext . Request = request ;
6677
@@ -77,7 +88,7 @@ public void OnAuthorization_AdminLevel_NoMasterKeySet_ReturnsUnauthorized()
7788 _hostSecrets . MasterKey = null ;
7889
7990 HttpRequestMessage request = new HttpRequestMessage ( ) ;
80- request . Headers . Add ( AuthorizationLevelAttribute . MasterKeyHeaderName , TestMasterKeyValue ) ;
91+ request . Headers . Add ( AuthorizationLevelAttribute . FunctionsKeyHeaderName , TestMasterKeyValue ) ;
8192 _actionContext . ControllerContext . Request = request ;
8293
8394 attribute . OnAuthorization ( _actionContext ) ;
@@ -97,5 +108,80 @@ public void OnAuthorization_AnonymousLevel_Succeeds()
97108
98109 Assert . Null ( _actionContext . Response ) ;
99110 }
111+
112+ [ Fact ]
113+ public void GetAuthorizationLevel_ValidKeyHeader_MasterKey_ReturnsAdmin ( )
114+ {
115+ HttpRequestMessage request = new HttpRequestMessage ( ) ;
116+ request . Headers . Add ( AuthorizationLevelAttribute . FunctionsKeyHeaderName , TestMasterKeyValue ) ;
117+
118+ AuthorizationLevel level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object ) ;
119+
120+ Assert . Equal ( AuthorizationLevel . Admin , level ) ;
121+ }
122+
123+ [ Fact ]
124+ public void GetAuthorizationLevel_ValidKeyHeader_FunctionKey_ReturnsFunction ( )
125+ {
126+ // first verify the host level function key works
127+ HttpRequestMessage request = new HttpRequestMessage ( ) ;
128+ request . Headers . Add ( AuthorizationLevelAttribute . FunctionsKeyHeaderName , TestHostFunctionKeyValue ) ;
129+ AuthorizationLevel level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object ) ;
130+ Assert . Equal ( AuthorizationLevel . Function , level ) ;
131+
132+ // test function specific key
133+ request = new HttpRequestMessage ( ) ;
134+ request . Headers . Add ( AuthorizationLevelAttribute . FunctionsKeyHeaderName , TestFunctionKeyValue ) ;
135+ level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object , functionName : "TestFunction" ) ;
136+ Assert . Equal ( AuthorizationLevel . Function , level ) ;
137+ }
138+
139+ [ Fact ]
140+ public void GetAuthorizationLevel_InvalidKeyHeader_ReturnsAnonymous ( )
141+ {
142+ HttpRequestMessage request = new HttpRequestMessage ( ) ;
143+ request . Headers . Add ( AuthorizationLevelAttribute . FunctionsKeyHeaderName , "invalid" ) ;
144+
145+ AuthorizationLevel level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object ) ;
146+
147+ Assert . Equal ( AuthorizationLevel . Anonymous , level ) ;
148+ }
149+
150+ [ Fact ]
151+ public void GetAuthorizationLevel_ValidKeyQueryParam_MasterKey_ReturnsAdmin ( )
152+ {
153+ Uri uri = new Uri ( string . Format ( "http://functions/api/foo?key={0}" , TestMasterKeyValue ) ) ;
154+ HttpRequestMessage request = new HttpRequestMessage ( HttpMethod . Get , uri ) ;
155+
156+ AuthorizationLevel level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object ) ;
157+
158+ Assert . Equal ( AuthorizationLevel . Admin , level ) ;
159+ }
160+
161+ [ Fact ]
162+ public void GetAuthorizationLevel_ValidKeyQueryParam_FunctionKey_ReturnsFunction ( )
163+ {
164+ // first try host level function key
165+ Uri uri = new Uri ( string . Format ( "http://functions/api/foo?key={0}" , TestHostFunctionKeyValue ) ) ;
166+ HttpRequestMessage request = new HttpRequestMessage ( HttpMethod . Get , uri ) ;
167+ AuthorizationLevel level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object , functionName : "TestFunction" ) ;
168+ Assert . Equal ( AuthorizationLevel . Function , level ) ;
169+
170+ uri = new Uri ( string . Format ( "http://functions/api/foo?key={0}" , TestFunctionKeyValue ) ) ;
171+ request = new HttpRequestMessage ( HttpMethod . Get , uri ) ;
172+ level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object , functionName : "TestFunction" ) ;
173+ Assert . Equal ( AuthorizationLevel . Function , level ) ;
174+ }
175+
176+ [ Fact ]
177+ public void GetAuthorizationLevel_InvalidKeyQueryParam_ReturnsAnonymous ( )
178+ {
179+ Uri uri = new Uri ( string . Format ( "http://functions/api/foo?key={0}" , "invalid" ) ) ;
180+ HttpRequestMessage request = new HttpRequestMessage ( HttpMethod . Get , uri ) ;
181+
182+ AuthorizationLevel level = AuthorizationLevelAttribute . GetAuthorizationLevel ( request , _mockSecretManager . Object ) ;
183+
184+ Assert . Equal ( AuthorizationLevel . Anonymous , level ) ;
185+ }
100186 }
101187}
0 commit comments