1
1
// Copyright (c) .NET Foundation. All rights reserved.
2
2
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
3
4
+ using System ;
4
5
using System . Collections . Generic ;
5
6
using System . Linq ;
6
7
using System . Security . Claims ;
@@ -18,7 +19,7 @@ public class PolicyEvaluatorTests
18
19
public async Task AuthenticateFailsIfNoPrincipalReturned ( )
19
20
{
20
21
// Arrange
21
- var evaluator = new PolicyEvaluator ( new HappyAuthorization ( ) ) ;
22
+ var evaluator = BuildEvaluator ( ) ;
22
23
var context = new DefaultHttpContext ( ) ;
23
24
var services = new ServiceCollection ( ) . AddSingleton < IAuthenticationService , SadAuthentication > ( ) ;
24
25
context . RequestServices = services . BuildServiceProvider ( ) ;
@@ -35,7 +36,7 @@ public async Task AuthenticateFailsIfNoPrincipalReturned()
35
36
public async Task AuthenticateMergeSchemes ( )
36
37
{
37
38
// Arrange
38
- var evaluator = new PolicyEvaluator ( new HappyAuthorization ( ) ) ;
39
+ var evaluator = BuildEvaluator ( ) ;
39
40
var context = new DefaultHttpContext ( ) ;
40
41
var services = new ServiceCollection ( ) . AddSingleton < IAuthenticationService , EchoAuthentication > ( ) ;
41
42
context . RequestServices = services . BuildServiceProvider ( ) ;
@@ -54,29 +55,47 @@ public async Task AuthenticateMergeSchemes()
54
55
public async Task AuthorizeSucceedsEvenIfAuthenticationFails ( )
55
56
{
56
57
// Arrange
57
- var evaluator = new PolicyEvaluator ( new HappyAuthorization ( ) ) ;
58
+ var evaluator = BuildEvaluator ( ) ;
58
59
var context = new DefaultHttpContext ( ) ;
59
60
var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => true ) . Build ( ) ;
60
61
61
62
// 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 ) ;
63
64
64
65
// Assert
65
66
Assert . True ( result . Succeeded ) ;
66
67
Assert . False ( result . Challenged ) ;
67
68
Assert . False ( result . Forbidden ) ;
68
69
}
69
70
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
+
70
89
[ Fact ]
71
90
public async Task AuthorizeChallengesIfAuthenticationFails ( )
72
91
{
73
92
// Arrange
74
- var evaluator = new PolicyEvaluator ( new SadAuthorization ( ) ) ;
93
+ var evaluator = BuildEvaluator ( ) ;
75
94
var context = new DefaultHttpContext ( ) ;
76
- var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => true ) . Build ( ) ;
95
+ var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => false ) . Build ( ) ;
77
96
78
97
// 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 ) ;
80
99
81
100
// Assert
82
101
Assert . False ( result . Succeeded ) ;
@@ -88,19 +107,30 @@ public async Task AuthorizeChallengesIfAuthenticationFails()
88
107
public async Task AuthorizeForbidsIfAuthenticationSuceeds ( )
89
108
{
90
109
// Arrange
91
- var evaluator = new PolicyEvaluator ( new SadAuthorization ( ) ) ;
110
+ var evaluator = BuildEvaluator ( ) ;
92
111
var context = new DefaultHttpContext ( ) ;
93
- var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => true ) . Build ( ) ;
112
+ var policy = new AuthorizationPolicyBuilder ( ) . RequireAssertion ( _ => false ) . Build ( ) ;
94
113
95
114
// 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 ) ;
97
116
98
117
// Assert
99
118
Assert . False ( result . Succeeded ) ;
100
119
Assert . False ( result . Challenged ) ;
101
120
Assert . True ( result . Forbidden ) ;
102
121
}
103
122
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
+
104
134
public class HappyAuthorization : IAuthorizationService
105
135
{
106
136
public Task < AuthorizationResult > AuthorizeAsync ( ClaimsPrincipal user , object resource , IEnumerable < IAuthorizationRequirement > requirements )
0 commit comments