diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/AbpViewComponentHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/AbpViewComponentHelper.cs index 384952c893..1ef15ac8e6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/AbpViewComponentHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/AbpViewComponentHelper.cs @@ -1,17 +1,13 @@ using System; -using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewComponents; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.Options; -using Volo.Abp.Authorization; using Volo.Abp.DependencyInjection; -using Volo.Abp.Users; namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets { @@ -20,21 +16,15 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets { protected WidgetOptions Options { get; } protected IPageWidgetManager PageWidgetManager { get; } - protected IAuthorizationService AuthorizationService { get; } - protected ICurrentUser CurrentUser { get; } protected DefaultViewComponentHelper DefaultViewComponentHelper { get; } public AbpViewComponentHelper( DefaultViewComponentHelper defaultViewComponentHelper, IOptions widgetOptions, - IPageWidgetManager pageWidgetManager, - IAuthorizationService authorizationService, - ICurrentUser currentUser) + IPageWidgetManager pageWidgetManager) { DefaultViewComponentHelper = defaultViewComponentHelper; PageWidgetManager = pageWidgetManager; - AuthorizationService = authorizationService; - CurrentUser = currentUser; Options = widgetOptions.Value; } @@ -67,18 +57,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets protected virtual async Task InvokeWidgetAsync(object arguments, WidgetDefinition widget) { - if (widget.RequiredPolicies.Any()) - { - foreach (var requiredPolicy in widget.RequiredPolicies) - { - await AuthorizationService.AuthorizeAsync(requiredPolicy); - } - } - else if (widget.RequiresAuthentication && !CurrentUser.IsAuthenticated) - { - throw new AbpAuthorizationException("Authorization failed! User has not logged in."); - } - PageWidgetManager.TryAdd(widget); var wrapperAttributesBuilder = new StringBuilder($"class=\"abp-widget-wrapper\" data-widget-name=\"{widget.Name}\""); @@ -87,7 +65,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets { wrapperAttributesBuilder.Append($" data-refresh-url=\"{widget.RefreshUrl}\""); } - + return new HtmlContentBuilder() .AppendHtml($"
") .AppendHtml(await DefaultViewComponentHelper.InvokeAsync(widget.ViewComponentType, arguments)) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/IWidgetPolicyChecker.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/IWidgetPolicyChecker.cs new file mode 100644 index 0000000000..14819477f1 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/IWidgetPolicyChecker.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets +{ + public interface IWidgetPolicyChecker : ITransientDependency + { + Task CheckAsync(Type widgetComponentType); + + Task CheckAsync(string name); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/WidgetPolicyChecker.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/WidgetPolicyChecker.cs new file mode 100644 index 0000000000..7d88f2abe4 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Widgets/Volo/Abp/AspNetCore/Mvc/UI/Widgets/WidgetPolicyChecker.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc.ViewComponents; +using Microsoft.Extensions.Options; +using Volo.Abp.Users; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Widgets +{ + public class WidgetPolicyChecker : IWidgetPolicyChecker + { + protected WidgetOptions Options { get; } + protected IAuthorizationService AuthorizationService { get; } + protected ICurrentUser CurrentUser { get; } + + public WidgetPolicyChecker( + IOptions widgetOptions, + IAuthorizationService authorizationService, + ICurrentUser currentUser) + { + AuthorizationService = authorizationService; + CurrentUser = currentUser; + Options = widgetOptions.Value; + } + + public async Task CheckAsync(Type widgetComponentType) + { + var widget = Options.Widgets.Find(widgetComponentType); + + return await CheckAsyncInternal(widget, widgetComponentType.FullName); + } + + public async Task CheckAsync(string name) + { + var widget = Options.Widgets.Find(name); + + return await CheckAsyncInternal(widget, name); + } + + public async Task CheckAsyncInternal(WidgetDefinition widget, string wantedWidgetName) + { + if (widget == null) + { + throw new ArgumentNullException(wantedWidgetName); + } + + if (widget.RequiredPolicies.Any()) + { + foreach (var requiredPolicy in widget.RequiredPolicies) + { + if (!(await AuthorizationService.AuthorizeAsync(requiredPolicy)).Succeeded) + { + return false; + } + } + } + else if (widget.RequiresAuthentication && !CurrentUser.IsAuthenticated) + { + return false; + } + + return true; + } + } +} diff --git a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboard.cshtml b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboard.cshtml index fb48c277cd..7f9066cae8 100644 --- a/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboard.cshtml +++ b/samples/DashboardDemo/src/DashboardDemo.Web/Pages/MyDashboard.cshtml @@ -14,7 +14,7 @@ - +