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); } //} }
public PermissaoAcessoController(IPermissaoAcessoRepository permissaoAcessoRepository) { _permissaoAcessoRepository = permissaoAcessoRepository; }