コード例 #1
0
        public async Task AuthorizeFilterWillCallPolicyProviderOnAuthorization()
        {
            // Arrange
            var policyProvider = new Mock <IAuthorizationPolicyProvider>();
            var getPolicyCount = 0;

            policyProvider.Setup(p => p.GetPolicyAsync(It.IsAny <string>())).ReturnsAsync(new AuthorizationPolicyBuilder().RequireAssertion(_ => true).Build())
            .Callback(() => getPolicyCount++);
            var authorizeFilter      = new AuthorizeFilter(policyProvider.Object, new AuthorizeAttribute[] { new AuthorizeAttribute("whatever") });
            var authorizationContext = GetAuthorizationContext();

            authorizationContext.Filters.Add(authorizeFilter);

            // Act & Assert
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            Assert.Equal(1, getPolicyCount);
            Assert.Null(authorizationContext.Result);

            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            Assert.Equal(2, getPolicyCount);
            Assert.Null(authorizationContext.Result);

            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            Assert.Equal(3, getPolicyCount);
            Assert.Null(authorizationContext.Result);

            // Make sure we don't cache the policy
            Assert.Null(authorizeFilter.Policy);
        }
コード例 #2
0
        public async Task Invoke_FailedContextShouldNotCheckPermission()
        {
            // Arrange
            bool authorizationServiceIsCalled = false;
            var  authorizationService         = new Mock <IAuthorizationService>();

            authorizationService
            .Setup(x => x.AuthorizeAsync(null, null, "CanViewComment"))
            .Returns(() =>
            {
                authorizationServiceIsCalled = true;
                return(Task.FromResult(true));
            });

            var authorizeFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder()
                                                      .RequireClaim("Permission", "CanViewComment")
                                                      .Build());
            var authorizationContext = GetAuthorizationContext(services =>
                                                               services.AddSingleton(authorizationService.Object));

            authorizationContext.Result = new UnauthorizedResult();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.False(authorizationServiceIsCalled);
        }
コード例 #3
0
        public async Task AuthorizationFilterCombinesMultipleFiltersWithPolicyProvider()
        {
            // Arrange
            var authorizeFilter = new AuthorizeFilter(new TestPolicyProvider(), new IAuthorizeData[]
            {
                new AuthorizeAttribute {
                    Policy = "true"
                },
                new AuthorizeAttribute {
                    Policy = "false"
                }
            });
            var authorizationContext = GetAuthorizationContext(anonymous: false);

            // Effective policy should fail, if both are combined
            authorizationContext.Filters.Add(authorizeFilter);
            var secondFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(a => true).Build());

            authorizationContext.Filters.Add(secondFilter);

            // Act
            await secondFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.IsType <ForbidResult>(authorizationContext.Result);
        }
コード例 #4
0
        public async Task AuthorizationFilterCombinesMultipleFiltersWithDifferentPolicyProvider()
        {
            // Arrange
            var testProvider1   = new TestPolicyProvider();
            var testProvider2   = new TestPolicyProvider();
            var authorizeFilter = new AuthorizeFilter(testProvider1, new IAuthorizeData[]
            {
                new AuthorizeAttribute {
                    Policy = "true"
                },
                new AuthorizeAttribute {
                    Policy = "false"
                }
            });
            var authorizationContext = GetAuthorizationContext(anonymous: false);

            // Effective policy should fail, if both are combined
            authorizationContext.Filters.Add(authorizeFilter);
            var secondFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(a => true).Build());

            authorizationContext.Filters.Add(secondFilter);
            var thirdFilter = new AuthorizeFilter(testProvider2, new IAuthorizeData[] { new AuthorizeAttribute(policy: "something") });

            authorizationContext.Filters.Add(thirdFilter);

            // Act
            await thirdFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.IsType <ForbidResult>(authorizationContext.Result);
            Assert.Equal(2, testProvider1.GetPolicyCalls);
            Assert.Equal(1, testProvider2.GetPolicyCalls);

            // Make sure the policy calls are not cached
            await thirdFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.IsType <ForbidResult>(authorizationContext.Result);
            Assert.Equal(4, testProvider1.GetPolicyCalls);
            Assert.Equal(2, testProvider2.GetPolicyCalls);
        }
コード例 #5
0
        public async Task Invoke_RequireUnknownRoleShouldFail()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireRole("Wut").Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.Result);
        }
コード例 #6
0
        public async Task Invoke_RequireAdminAndUserRoleWithNoPolicyShouldSucceed()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireRole("Administrator").Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #7
0
        public async Task Invoke_RequireUnknownRoleShouldForbid()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireRole("Wut").Build());
            var authorizationContext = GetAuthorizationContext();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.IsType <ForbidResult>(authorizationContext.Result);
        }
コード例 #8
0
        public async Task AuthZResourceShouldBeAuthorizationFilterContext()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(c => c.Resource is AuthorizationFilterContext).Build());
            var authorizationContext = GetAuthorizationContext();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #9
0
        public async Task AuthorizeFilterCanAuthorizeNullUser()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(_ => true).Build());
            var authorizationContext = GetAuthorizationContext(anonymous: true);

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #10
0
        public async Task Invoke_ValidClaimShouldNotFail()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireClaim("Permission", "CanViewPage").Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #11
0
        public async Task Invoke_SingleValidClaimShouldSucceed()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireClaim("Permission", "CanViewComment", "CanViewPage").Build());
            var authorizationContext = GetAuthorizationContext();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #12
0
        public async Task Invoke_EmptyClaimsShouldAuthorizeAuthenticatedUser()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build());
            var authorizationContext = GetAuthorizationContext();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #13
0
        public async Task Invoke_EmptyClaimsShouldChallengeAnonymousUser()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build());
            var authorizationContext = GetAuthorizationContext(anonymous: true);

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.IsType <ChallengeResult>(authorizationContext.Result);
        }
コード例 #14
0
        public async Task Invoke_AuthSchemesFailShouldSetEmptyPrincipalOnContext()
        {
            // Arrange
            var authorizeFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder("Fails")
                                                      .RequireAuthenticatedUser()
                                                      .Build());
            var authorizationContext = GetAuthorizationContext();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.HttpContext.User?.Identity);
        }
コード例 #15
0
        public async Task Invoke_EmptyClaimsWithAllowAnonymousAttributeShouldNotRejectAnonymousUser()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build());
            var authorizationContext = GetAuthorizationContext(anonymous: true);

            authorizationContext.Filters.Add(new AllowAnonymousFilter());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #16
0
        public async Task Invoke_CanFilterToOnlyBearerScheme()
        {
            // Arrange
            var authorizeFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder("Bearer")
                                                      .RequireClaim("Permission", "CanViewPage")
                                                      .Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.Result);
        }
コード例 #17
0
        public async Task Invoke_FailWhenLookingForClaimInOtherIdentity()
        {
            // Arrange
            var authorizeFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder()
                                                      .RequireClaim("Permission", "CanViewComment")
                                                      .Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.Result);
        }
コード例 #18
0
        public async Task AuthorizeFilter_CreatedWithPolicy_ThrowsWhenOnAuthorizationAsyncIsCalled()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new[] { new AuthorizeAttribute() });
            var authorizationContext = GetAuthorizationContext();
            var expected             = "An AuthorizationPolicy cannot be created without a valid instance of " +
                                       "IAuthorizationPolicyProvider.";

            // Act & Assert
            var ex = await Assert.ThrowsAsync <InvalidOperationException>(
                () => authorizeFilter.OnAuthorizationAsync(authorizationContext));

            Assert.Equal(expected, ex.Message);
        }
コード例 #19
0
        public async Task Invoke_InvalidClaimShouldForbid()
        {
            // Arrange
            var authorizeFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder()
                                                      .RequireClaim("Permission", "CanViewComment")
                                                      .Build());
            var authorizationContext = GetAuthorizationContext();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.IsType <ForbidResult>(authorizationContext.Result);
        }
コード例 #20
0
        public async Task Invoke_EmptyClaimsShouldRejectAnonymousUser()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build());
            var authorizationContext = GetAuthorizationContext(services =>
                                                               services.AddAuthorization(),
                                                               anonymous: true);

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.Result);
        }
コード例 #21
0
        public async Task AuthorizeFilterCanAuthorizeNonAuthenticatedUser()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(_ => true).Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization(), anonymous: true);

            authorizationContext.HttpContext.User = new ClaimsPrincipal();

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #22
0
        public async Task Invoke_CanLookingForClaimsInMultipleIdentities()
        {
            // Arrange
            var authorizeFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder("Basic", "Bearer")
                                                      .RequireClaim("Permission", "CanViewComment")
                                                      .RequireClaim("Permission", "CupBearer")
                                                      .Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.Result);
        }
コード例 #23
0
        public async Task Invoke_RequireAdminRoleButFailPolicyShouldFail()
        {
            // Arrange
            var authorizeFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder()
                                                      .RequireRole("Administrator")
                                                      .RequireClaim("Permission", "CanViewComment")
                                                      .Build());
            var authorizationContext = GetAuthorizationContext(services => services.AddAuthorization());

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.Result);
        }
コード例 #24
0
        public async Task AuthorizationFilterIgnoresFirstFilterWhenCombining()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(a => false).Build());
            var authorizationContext = GetAuthorizationContext(anonymous: false);

            // Effective policy should fail, if both are combined
            authorizationContext.Filters.Add(authorizeFilter);
            var secondFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(a => false).Build());

            authorizationContext.Filters.Add(secondFilter);

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.Null(authorizationContext.Result);
        }
コード例 #25
0
        public async Task Invoke_RequireAdminRoleShouldFailWithNoHandlers()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireRole("Administrator").Build());
            var authorizationContext = GetAuthorizationContext(services =>
            {
                services.AddOptions();
                services.AddAuthorization();

                services.Remove(services.Where(sd => sd.ServiceType == typeof(IAuthorizationHandler)).Single());
            });

            // Act
            await authorizeFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.NotNull(authorizationContext.Result);
        }
コード例 #26
0
        public async Task AuthorizationFilterCombinesMultipleFilters()
        {
            // Arrange
            var authorizeFilter      = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(a => true).Build());
            var authorizationContext = GetAuthorizationContext(anonymous: false, registerServices: s => s.Configure <MvcOptions>(o => o.AllowCombiningAuthorizeFilters = true));

            // Effective policy should fail, if both are combined
            authorizationContext.Filters.Add(authorizeFilter);
            var secondFilter = new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAssertion(a => false).Build());

            authorizationContext.Filters.Add(secondFilter);

            // Act
            await secondFilter.OnAuthorizationAsync(authorizationContext);

            // Assert
            Assert.IsType <ForbidResult>(authorizationContext.Result);
        }