コード例 #1
0
        public async Task SetResponseToCache()
        {
            _options.PdpCacheDuration = 60;
            var cacheEntry  = new TestCacheEntry();
            var mockedCache = CreateEmptyMockedCache();

            mockedCache.Setup(c => c.CreateEntry(BuildCacheKey(_userId)))
            .Returns(cacheEntry);

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { requestedresource })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var provider    = new PolicyDescisionProvider(mockedCache.Object, Options.Create(_options), mockHandler, _logger);

            var result = await provider.GetPermissionsAsync(_userId, _application);

            Assert.Equal(pdpResponse.applicationId, ((PdpResponse)cacheEntry.Value).applicationId);
            Assert.Equal(pdpResponse.userId, ((PdpResponse)cacheEntry.Value).userId);
            Assert.Equal(pdpResponse.permissions, ((PdpResponse)cacheEntry.Value).permissions);
        }
コード例 #2
0
        public async Task CacheDurationFromOptionsIsUsed()
        {
            _options.PdpCacheDuration = 60;
            var cacheEntry  = new TestCacheEntry();
            var mockedCache = CreateEmptyMockedCache();

            mockedCache.Setup(c => c.CreateEntry(BuildCacheKey(_userId)))
            .Returns(cacheEntry);

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { _requestedresource })
            };
            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var client      = new HttpClient(mockHandler);
            var uri         = _options.PdpUrl.EndsWith("/") ? _options.PdpUrl : $"{_options.PdpUrl}/";

            client.BaseAddress = new Uri(uri);
            var provider = new PolicyDecisionProvider(client, mockedCache.Object, Options.Create(_options), _logger);

            var result = await provider.GetPermissionsAsync(_userId, _application);

            Assert.True(cacheEntry.AbsoluteExpirationRelativeToNow.Value == new TimeSpan(0, _options.PdpCacheDuration, 0));
        }
コード例 #3
0
        public async Task ShouldCacheResponseWithoutPermissions()
        {
            _options.PdpCacheDuration = 60;
            var cacheEntry  = new TestCacheEntry();
            var mockedCache = CreateEmptyMockedCache();

            mockedCache.Setup(c => c.CreateEntry(BuildCacheKey(_userId)))
            .Returns(cacheEntry);

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var client      = new HttpClient(mockHandler);
            var uri         = _options.PdpUrl.EndsWith("/") ? _options.PdpUrl : $"{_options.PdpUrl}/";

            client.BaseAddress = new Uri(uri);
            var provider = new PolicyDecisionProvider(client, mockedCache.Object, Options.Create(_options), _logger);

            var result = await provider.GetPermissionsAsync(_userId, _application);

            mockedCache.Verify(c => c.CreateEntry(It.IsAny <object>()), Times.Once);
            Assert.NotNull(cacheEntry.Value);
            Assert.Equal(new List <string>(), ((PdpResponse)cacheEntry.Value).permissions);
        }
コード例 #4
0
        private IPolicyDescisionProvider CreateMockPolicyDescisionProvider(PdpResponse pdpResponse, string applicationName)
        {
            var mockPdpProvider = new Mock <IPolicyDescisionProvider>();

            mockPdpProvider.Setup(p => p.GetPermissionsAsync(_userId, applicationName))
            .ReturnsAsync(pdpResponse);

            return(mockPdpProvider.Object);
        }
コード例 #5
0
        private Mock <IMemoryCache> CreateMockedCache(string key, PdpResponse pdpResponse)
        {
            var mockCache    = new Mock <IMemoryCache>();
            var cachedObject = pdpResponse as object;

            mockCache.Setup(c => c.TryGetValue("", out cachedObject))
            .Returns(false);

            mockCache.Setup(c => c.TryGetValue(key, out cachedObject))
            .Returns(true);

            return(mockCache);
        }
コード例 #6
0
        public async Task ApiKeyIsSetInHeader()
        {
            var mockedCache = CreateEmptyMockedCache();

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { requestedresource })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var provider    = new PolicyDescisionProvider(mockedCache.Object, Options.Create(_options), mockHandler, _logger);
            var result      = await provider.GetPermissionsAsync(_userId, _application);

            Assert.Equal(_apiKey, mockHandler.Headers.GetValues(HeaderKeys.Apikey).FirstOrDefault());
        }
コード例 #7
0
        public async Task GetCachedPdpResponse()
        {
            _options.PdpCacheDuration = 60;
            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { _requestedresource })
            };

            var mockedCache = CreateMockedCache(BuildCacheKey(_userId), pdpResponse);
            var provider    = new PolicyDecisionProvider(Mock.Of <HttpClient>(), mockedCache.Object, Options.Create(_options), _logger);

            var result = await provider.GetPermissionsAsync(_userId, _application);

            Assert.Equal(pdpResponse, result);
        }
コード例 #8
0
        public async Task DoesNothingWhenNoPermissionsReturned()
        {
            var pdpResponse = new PdpResponse
            {
                applicationId = _authOptions.ApplicationName,
                userId        = _userId,
            };

            var pdpProvider = CreateMockPolicyDescisionProvider(pdpResponse, ApplicationName);

            var transformer = new PermissionsClaimsTransformer(CreateMockPermissionApplicationNameProvider(ApplicationName), pdpProvider);
            var user        = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] { new Claim(Claims.Name, _userId), new Claim(ClaimTypes.Name, _userId) }, "Bearer"));

            var result = await transformer.TransformAsync(user);

            Assert.NotNull(result);
            Assert.False(result.HasClaim(c => c.Type == Claims.PermissionsType));
        }
コード例 #9
0
        public async Task GetCachedPdpResponse()
        {
            _options.PdpCacheDuration = 60;
            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { requestedresource })
            };

            var mockedCache = CreateMockedCache(BuildCacheKey(_userId), pdpResponse);
            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.NotFound, null);
            var provider    = new PolicyDescisionProvider(mockedCache.Object, Options.Create(_options), mockHandler, _logger);

            var result = await provider.GetPermissionsAsync(_userId, _application);

            Assert.Equal(pdpResponse, result);
        }
コード例 #10
0
        public async Task ReturnsNullIfUserUnknown()
        {
            var mockedCache = CreateEmptyMockedCache();

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { requestedresource })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.NotFound, null);
            var provider    = new PolicyDescisionProvider(mockedCache.Object, Options.Create(_options), mockHandler, _logger);
            var result      = await provider.GetPermissionsAsync("otherUser", _application);

            Assert.Null(result);
            Assert.NotEmpty(_logger.LoggedMessages);
        }
コード例 #11
0
        public async Task GetResponse()
        {
            var mockedCache = CreateEmptyMockedCache();

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { requestedresource })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var provider    = new PolicyDescisionProvider(mockedCache.Object, Options.Create(_options), mockHandler, _logger);
            var result      = await provider.GetPermissionsAsync(_userId, _application);

            Assert.Equal(pdpResponse.applicationId, result.applicationId);
            Assert.Equal(pdpResponse.userId, result.userId);
            Assert.Equal(pdpResponse.permissions, result.permissions);
        }
コード例 #12
0
        public async Task SetClaims()
        {
            var pdpResponse = new PdpResponse
            {
                applicationId = _authOptions.ApplicationName,
                userId        = _userId,
                permissions   = new List <String>(new string[] { "permission1", "permission2" })
            };

            var pdpProvider = CreateMockPolicyDescisionProvider(pdpResponse, ApplicationName);

            var transformer = new PermissionsClaimsTransformer(CreateMockPermissionApplicationNameProvider(ApplicationName), pdpProvider);
            var user        = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] { new Claim(Claims.Name, _userId), new Claim(ClaimTypes.Name, _userId) }, "Bearer"));

            var result = await transformer.TransformAsync(user);

            Assert.NotNull(result);
            Assert.True(result.HasClaim(Claims.PermissionsType, "permission1"));
            Assert.True(result.HasClaim(Claims.PermissionsType, "permission2"));
        }
コード例 #13
0
        public async Task GetResponse()
        {
            var mockedCache = CreateEmptyMockedCache();

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { _requestedresource })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var client      = new HttpClient(mockHandler);
            var uri         = _options.PdpUrl.EndsWith("/") ? _options.PdpUrl : $"{_options.PdpUrl}/";

            client.BaseAddress = new Uri(uri);
            var provider = new PolicyDecisionProvider(client, mockedCache.Object, Options.Create(_options), _logger);
            var result   = await provider.GetPermissionsAsync(_userId, _application);

            Assert.Equal(pdpResponse.applicationId, result.applicationId);
            Assert.Equal(pdpResponse.userId, result.userId);
            Assert.Equal(pdpResponse.permissions, result.permissions);
        }
コード例 #14
0
        public async Task ApiKeyIsSetInHeader()
        {
            var mockedCache = CreateEmptyMockedCache();

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { requestedresource })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var httpClient  = new HttpClient(mockHandler);

            httpClient.DefaultRequestHeaders.TryAddWithoutValidation(HeaderKeys.Apikey, _options.PdpApiKey);
            var uri = _options.PdpUrl.EndsWith("/") ? _options.PdpUrl : $"{_options.PdpUrl}/";

            httpClient.BaseAddress = new Uri(uri);
            var provider = new PolicyDecisionProvider(httpClient, mockedCache.Object, Options.Create(_options), _logger);
            var result   = await provider.GetPermissionsAsync(_userId, _application);

            Assert.Equal(_apiKey, httpClient.DefaultRequestHeaders.GetValues(HeaderKeys.Apikey).FirstOrDefault());
        }
コード例 #15
0
        public async Task ShouldNotCacheResponseWithoutPermissions()
        {
            _options.PdpCacheDuration = 60;
            var cacheEntry  = new TestCacheEntry();
            var mockedCache = CreateEmptyMockedCache();

            mockedCache.Setup(c => c.CreateEntry(BuildCacheKey(_userId)))
            .Returns(cacheEntry);

            var pdpResponse = new PdpResponse
            {
                applicationId = _application,
                userId        = _userId,
                permissions   = new List <String>(new string[] { })
            };

            var mockHandler = new MockMessageHandler <PdpResponse>(HttpStatusCode.OK, pdpResponse);
            var provider    = new PolicyDescisionProvider(mockedCache.Object, Options.Create(_options), mockHandler, _logger);

            var result = await provider.GetPermissionsAsync(_userId, _application);

            mockedCache.Verify(c => c.CreateEntry(It.IsAny <object>()), Times.Never);
            Assert.Null(cacheEntry.Value);
        }