11// Copyright (c) .NET Foundation. All rights reserved.
22// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33
4+ using System ;
45using System . Collections . Generic ;
56using System . Linq ;
67using System . Security . Claims ;
@@ -18,7 +19,7 @@ public class PolicyEvaluatorTests
1819 public async Task AuthenticateFailsIfNoPrincipalReturned ( )
1920 {
2021 // Arrange
21- var evaluator = new PolicyEvaluator ( new HappyAuthorization ( ) ) ;
22+ var evaluator = BuildEvaluator ( ) ;
2223 var context = new DefaultHttpContext ( ) ;
2324 var services = new ServiceCollection ( ) . AddSingleton < IAuthenticationService , SadAuthentication > ( ) ;
2425 context . RequestServices = services . BuildServiceProvider ( ) ;
@@ -35,7 +36,7 @@ public async Task AuthenticateFailsIfNoPrincipalReturned()
3536 public async Task AuthenticateMergeSchemes ( )
3637 {
3738 // Arrange
38- var evaluator = new PolicyEvaluator ( new HappyAuthorization ( ) ) ;
39+ var evaluator = BuildEvaluator ( ) ;
3940 var context = new DefaultHttpContext ( ) ;
4041 var services = new ServiceCollection ( ) . AddSingleton < IAuthenticationService , EchoAuthentication > ( ) ;
4142 context . RequestServices = services . BuildServiceProvider ( ) ;
@@ -54,29 +55,47 @@ public async Task AuthenticateMergeSchemes()
5455 public async Task AuthorizeSucceedsEvenIfAuthenticationFails ( )
5556 {
5657 // Arrange
57- var evaluator = new PolicyEvaluator ( new HappyAuthorization ( ) ) ;
58+ var evaluator = BuildEvaluator ( ) ;
5859 var context = new DefaultHttpContext ( ) ;
5960 var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => true ) . Build ( ) ;
6061
6162 // Act
62- var result = await evaluator . AuthorizeAsync ( policy , AuthenticateResult . Fail ( "Nooo" ) , context ) ;
63+ var result = await evaluator . AuthorizeAsync ( policy , AuthenticateResult . Fail ( "Nooo" ) , context , resource : null ) ;
6364
6465 // Assert
6566 Assert . True ( result . Succeeded ) ;
6667 Assert . False ( result . Challenged ) ;
6768 Assert . False ( result . Forbidden ) ;
6869 }
6970
71+ [ Fact ]
72+ public async Task AuthorizeSucceedsOnlyIfResourceSpecified ( )
73+ {
74+ // Arrange
75+ var evaluator = BuildEvaluator ( ) ;
76+ var context = new DefaultHttpContext ( ) ;
77+ var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( c => c . Resource != null ) . Build ( ) ;
78+ var success = AuthenticateResult . Success ( new AuthenticationTicket ( new ClaimsPrincipal ( ) , "whatever" ) ) ;
79+
80+ // Act
81+ var result = await evaluator . AuthorizeAsync ( policy , success , context , resource : null ) ;
82+ var result2 = await evaluator . AuthorizeAsync ( policy , success , context , resource : new object ( ) ) ;
83+
84+ // Assert
85+ Assert . False ( result . Succeeded ) ;
86+ Assert . True ( result2 . Succeeded ) ;
87+ }
88+
7089 [ Fact ]
7190 public async Task AuthorizeChallengesIfAuthenticationFails ( )
7291 {
7392 // Arrange
74- var evaluator = new PolicyEvaluator ( new SadAuthorization ( ) ) ;
93+ var evaluator = BuildEvaluator ( ) ;
7594 var context = new DefaultHttpContext ( ) ;
76- var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => true ) . Build ( ) ;
95+ var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => false ) . Build ( ) ;
7796
7897 // Act
79- var result = await evaluator . AuthorizeAsync ( policy , AuthenticateResult . Fail ( "Nooo" ) , context ) ;
98+ var result = await evaluator . AuthorizeAsync ( policy , AuthenticateResult . Fail ( "Nooo" ) , context , resource : null ) ;
8099
81100 // Assert
82101 Assert . False ( result . Succeeded ) ;
@@ -88,19 +107,30 @@ public async Task AuthorizeChallengesIfAuthenticationFails()
88107 public async Task AuthorizeForbidsIfAuthenticationSuceeds ( )
89108 {
90109 // Arrange
91- var evaluator = new PolicyEvaluator ( new SadAuthorization ( ) ) ;
110+ var evaluator = BuildEvaluator ( ) ;
92111 var context = new DefaultHttpContext ( ) ;
93- var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => true ) . Build ( ) ;
112+ var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => false ) . Build ( ) ;
94113
95114 // Act
96- var result = await evaluator . AuthorizeAsync ( policy , AuthenticateResult . Success ( new AuthenticationTicket ( new ClaimsPrincipal ( ) , "scheme" ) ) , context ) ;
115+ var result = await evaluator . AuthorizeAsync ( policy , AuthenticateResult . Success ( new AuthenticationTicket ( new ClaimsPrincipal ( ) , "scheme" ) ) , context , resource : null ) ;
97116
98117 // Assert
99118 Assert . False ( result . Succeeded ) ;
100119 Assert . False ( result . Challenged ) ;
101120 Assert . True ( result . Forbidden ) ;
102121 }
103122
123+ private IPolicyEvaluator BuildEvaluator ( Action < IServiceCollection > setupServices = null )
124+ {
125+ var services = new ServiceCollection ( )
126+ . AddAuthorization ( )
127+ . AddAuthorizationPolicyEvaluator ( )
128+ . AddLogging ( )
129+ . AddOptions ( ) ;
130+ setupServices ? . Invoke ( services ) ;
131+ return services . BuildServiceProvider ( ) . GetRequiredService < IPolicyEvaluator > ( ) ;
132+ }
133+
104134 public class HappyAuthorization : IAuthorizationService
105135 {
106136 public Task < AuthorizationResult > AuthorizeAsync ( ClaimsPrincipal user , object resource , IEnumerable < IAuthorizationRequirement > requirements )
0 commit comments