Пример #1
0
        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);
        }