public static void InvokeIfPermitted(string assemblyName, string controllersNameSpace, ClaimsPrincipal user, Func <MenuItemBuilder> elementSettings, string method, string controller) { if (!assemblies.ContainsKey(assemblyName)) { Assembly tmpAssembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.GetName().Name == assemblyName); if (tmpAssembly == null) { throw new CommonException($"Can't find an assembly with the name {assemblyName}"); } assemblies.TryAdd(assemblyName, tmpAssembly); } string url = $"{controller}/{method}".ToLower(); if (!urlAndRequiredPermissions.ContainsKey(url)) { List <MethodInfo> methods = assemblies[assemblyName].GetType($"{controllersNameSpace}.{controller}Controller") ?.GetMethods().Where(x => x.Name == method).ToList(); List <string> permissionList = new List <string>(); foreach (MethodInfo mi in methods) { AuthorizeUserAttribute tmpAttr = mi.GetCustomAttribute(typeof(AuthorizeUserAttribute)) as AuthorizeUserAttribute; if (tmpAttr != null && tmpAttr.Arguments != null && tmpAttr.Arguments.Length > 0) { permissionList.AddRange((tmpAttr.Arguments[0] as string).Split(',')); } } if (permissionList.Count > 0) { urlAndRequiredPermissions.TryAdd(url, permissionList.Distinct().ToArray()); } else { urlAndRequiredPermissions.TryAdd(url, null); } } if (urlAndRequiredPermissions[url] != null) { IEnumerable <Claim> claims = ClaimHelper.GetUserPermissionClaims(user); if (claims.FirstOrDefault(x => x.Value == AuthorizeActionFilter.TotalAccessPermission) == null) { foreach (string requiredPermission in urlAndRequiredPermissions[url]) { if (claims.FirstOrDefault(x => x.Value == requiredPermission) == null) { return; } } } } elementSettings.Invoke().Action(method, controller); }