/// <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); } }
/// <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)); }