コード例 #1
0
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var    hasClaim  = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type && c.Value == _claim.Value);
            bool   permitido = false;
            var    rolesMes  = new List <string>();
            var    wi        = (WindowsIdentity)_httpContextAccessor.HttpContext.User.Identity;
            string cacheKey  = $"getGrupos_{wi.Name}";

            bool permissoesEmCache = _memoryCache.TryGetValue(wi.Name, out rolesMes);

            var funcionalidade = _claim.Value.Substring(0, _claim.Value.LastIndexOf('_'));
            var acao           = _claim.Value.Substring(_claim.Value.LastIndexOf('_') + 1,
                                                        _claim.Value.Length - 1 - _claim.Value.Substring(0, _claim.Value.LastIndexOf('_')).Length);


            if (!permissoesEmCache)
            {
                _permissaoAcessoRepository = (_permissaoAcessoRepository == null)
                    ? IOC.Container.Resolve <IPermissaoAcessoRepository>()
                    : _permissaoAcessoRepository;

                IList <string> rolesADUser = new List <string>()
                {
                    "GRUPO_MANUTENCAO", "GRUPO_EVENTO", "GRUPO_PESQUISA"
                };

                //A QUERY EXECUTADA AQUI ESTÁ FUNCIONANDO CONFORME O ESPERADO
                //FAZ JOIN CORRETAMENTE.

                //ENG
                //QUERY PERFORMED HERE IS WORKING AS EXPECTED
                //MAKES JOIN CORRECTLY

                var permissoes = _permissaoAcessoRepository.FindPorGruposAd(rolesADUser);

                //N + 1 PROBLEM
                //FOR EACH LIST ITEM RETURNS TO DATABASE.
                permissoes.ToList().ForEach(p =>
                {
                    rolesMes.Add(p.AcaoFuncionalidadeMes01.NmAcao + "---" + p.AcaoFuncionalidadeMes01.NmFncaoMes);
                });
                //********************


                var cacheEntryOptions = new MemoryCacheEntryOptions()
                                        .SetSlidingExpiration(TimeSpan.FromMinutes(CacheDurationInMinutes));

                _memoryCache.Set(wi.Name, rolesMes, cacheEntryOptions);
            }

            permitido = usuarioPossuiAcesso(acao, funcionalidade, rolesMes);

            if (!permitido)
            {
                context.Result = new ForbidResult();
                try
                {
                    //var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
                }
                catch (Exception ex)
                {
                    throw new Exception("CONVERSÃO__ERRO AO OBTER httpContext - " + ex.Message);
                }

                throw new Exception("PERMISSÃO__Usuário não possui acesso ao recurso." + _httpContextAccessor.HttpContext.User.Identity.Name);
            }

            //}
        }
コード例 #2
0
 public PermissaoAcessoController(IPermissaoAcessoRepository permissaoAcessoRepository)
 {
     _permissaoAcessoRepository = permissaoAcessoRepository;
 }