Beispiel #1
0
        /// <summary>
        /// Runs the view model filter.
        /// </summary>
        /// <param name="hubContext">Hub context.</param>
        /// <param name="vm">View model instance.</param>
        public void RunVMFilters(DotNetifyHubContext hubContext, BaseVM vm, NextFilterDelegate finalFilter)
        {
            var nextFilters = new Stack <NextFilterDelegate>();

            nextFilters.Push(finalFilter);

            // Find and execute the filter that matches each view model class attribute.
            foreach (var attr in vm.GetType().GetTypeInfo().GetCustomAttributes().Reverse())
            {
                var vmFilterType = typeof(IVMFilter <>).MakeGenericType(attr.GetType());
                if (_vmFilterFactories.Keys.Any(t => vmFilterType.IsAssignableFrom(t)))
                {
                    var vmFilter             = _vmFilterFactories.FirstOrDefault(kvp => vmFilterType.IsAssignableFrom(kvp.Key)).Value();
                    var vmFilterInvokeMethod = vmFilterType.GetMethod(nameof(IVMFilter <Attribute> .Invoke));
                    if (vmFilterInvokeMethod != null)
                    {
                        nextFilters.Push(ctx => (Task)vmFilterInvokeMethod.Invoke(vmFilter, new object[] { attr, ctx, nextFilters.Pop() }));
                    }
                }
            }

            var vmContext = new VMContext(hubContext, vm);

            if (nextFilters.Count > 0)
            {
                nextFilters.Pop()(vmContext);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Returns whether current security context is authorized to access a view model.
        /// </summary>
        /// <param name="vmInstance">View model instance.</param>
        /// <returns>True if authorized.</returns>
        protected virtual bool IsAuthorized(BaseVM vmInstance)
        {
            var authAttr = vmInstance.GetType().GetTypeInfo().GetCustomAttribute <AuthorizeAttribute>();

            return(authAttr == null || authAttr.IsAuthorized(Principal));
        }