// public async Task<Boolean> IsInRoleAsync(ClaimsPrincipal user, String role) {
        //     PolicyResult policy = await EvaluateAsync(user);
        //     return policy.Roles.Contains(role);
        // }

        // public async Task<Boolean> HasPermissionAsync(ClaimsPrincipal user, String permission) {
        //     PolicyResult policy = await EvaluateAsync(user);
        //     return policy.Permissions.Contains(permission);
        // }

        public async Task <PolicyResult> EvaluateAsync(Policy policy, ClaimsPrincipal user)
        {
            if (policy.Hash.IsMissing())
            {
                policy.CalculateHash();
            }
            if (policy.LastPolicyChangeDate == DateTime.MinValue)
            {
                policy.LastPolicyChangeDate = DateTime.Now;
            }
            PolicyResult result = await policy.EvaluateAsync(user);

            return(result);
        }
        public async Task <PolicyResult> EvaluateAsync(Policy policy, ClaimsPrincipal user)
        {
            if (policy.Hash.IsMissing())
            {
                policy.CalculateHash();
            }

            PolicyResult policyResult = await _cache.GetAsync(
                $"{policy.Hash}|||{user.Identity.Name}",
                _options.Caching.UserPolicyServiceExpiration,
                () => _inner.EvaluateAsync(policy, user),
                _logger
                );

            return(policyResult);
        }