diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs
index dccfa6aaa0..c22a354b71 100644
--- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs
+++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/RazorPages/AbpPageModel.cs
@@ -1,9 +1,12 @@
using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.AspNetCore.Mvc.Validation;
+using Volo.Abp.Authorization;
using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
@@ -28,6 +31,8 @@ namespace Volo.Abp.AspNetCore.Mvc.RazorPages
public IModelStateValidator ModelValidator { get; set; }
+ public IAuthorizationService AuthorizationService { get; set; }
+
protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current;
protected ILogger Logger => _lazyLogger.Value;
@@ -42,5 +47,10 @@ namespace Volo.Abp.AspNetCore.Mvc.RazorPages
{
ModelValidator?.Validate(ModelState);
}
+
+ protected virtual Task CheckPolicyAsync(string policyName)
+ {
+ return AuthorizationService.CheckAsync(policyName);
+ }
}
}
diff --git a/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj b/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj
index da895d7822..21bcf1102f 100644
--- a/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj
+++ b/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj
@@ -18,7 +18,7 @@
-
+
diff --git a/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs
index e15844b082..7c978103d4 100644
--- a/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs
+++ b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs
@@ -1,9 +1,11 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
+using Volo.Abp.Security;
namespace Volo.Abp.Authorization
{
+ [DependsOn(typeof(AbpSecurityModule))]
public class AbpAuthorizationModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
diff --git a/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationService.cs b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationService.cs
new file mode 100644
index 0000000000..c35471ee5b
--- /dev/null
+++ b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationService.cs
@@ -0,0 +1,43 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Security.Claims;
+
+namespace Volo.Abp.Authorization
+{
+ [Dependency(ReplaceServices = true)]
+ public class AbpAuthorizationService : DefaultAuthorizationService, IAbpAuthorizationService, ITransientDependency
+ {
+ private readonly ICurrentPrincipalAccessor _currentPrincipalAccessor;
+
+ public AbpAuthorizationService(
+ IAuthorizationPolicyProvider policyProvider,
+ IAuthorizationHandlerProvider handlers,
+ ILogger logger,
+ IAuthorizationHandlerContextFactory contextFactory,
+ IAuthorizationEvaluator evaluator,
+ IOptions options,
+ ICurrentPrincipalAccessor currentPrincipalAccessor)
+ : base(
+ policyProvider,
+ handlers,
+ logger,
+ contextFactory,
+ evaluator,
+ options)
+ {
+ _currentPrincipalAccessor = currentPrincipalAccessor;
+ }
+
+ public async Task CheckAsync(string policyName)
+ {
+ var result = await AuthorizeAsync(_currentPrincipalAccessor.Principal, null, policyName);
+ if (!result.Succeeded)
+ {
+ throw new AbpAuthorizationException("Authorization failed! Given policy has not granted: " + policyName);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationServiceExtensions.cs b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationServiceExtensions.cs
new file mode 100644
index 0000000000..9b6c020ff1
--- /dev/null
+++ b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationServiceExtensions.cs
@@ -0,0 +1,23 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+
+namespace Volo.Abp.Authorization
+{
+ public static class AbpAuthorizationServiceExtensions
+ {
+ public static Task CheckAsync(this IAuthorizationService authorizationService, string policyName)
+ {
+ return authorizationService.AsAbpAuthorizationService().CheckAsync(policyName);
+ }
+
+ private static IAbpAuthorizationService AsAbpAuthorizationService(this IAuthorizationService authorizationService)
+ {
+ if (!(authorizationService is IAbpAuthorizationService abpAuthorizationService))
+ {
+ throw new AbpException($"{nameof(authorizationService)} should implement {typeof(IAbpAuthorizationService).FullName}");
+ }
+
+ return abpAuthorizationService;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Volo.Abp.Authorization/Volo/Abp/Authorization/IAbpAuthorizationService.cs b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/IAbpAuthorizationService.cs
new file mode 100644
index 0000000000..5928b26062
--- /dev/null
+++ b/src/Volo.Abp.Authorization/Volo/Abp/Authorization/IAbpAuthorizationService.cs
@@ -0,0 +1,10 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+
+namespace Volo.Abp.Authorization
+{
+ public interface IAbpAuthorizationService : IAuthorizationService
+ {
+ Task CheckAsync(string policyName);
+ }
+}
\ No newline at end of file
diff --git a/src/Volo.Abp.Permissions.Web/Pages/AbpPermissions/PermissionManagementModal.cshtml.cs b/src/Volo.Abp.Permissions.Web/Pages/AbpPermissions/PermissionManagementModal.cshtml.cs
index 0a31a02cfe..bc7c8bfd82 100644
--- a/src/Volo.Abp.Permissions.Web/Pages/AbpPermissions/PermissionManagementModal.cshtml.cs
+++ b/src/Volo.Abp.Permissions.Web/Pages/AbpPermissions/PermissionManagementModal.cshtml.cs
@@ -31,6 +31,9 @@ namespace Volo.Abp.Permissions.Web.Pages.AbpPermissions
public async Task OnGetAsync()
{
+ ValidateModel();
+ await CheckPolicyAsync(PermissionPermissions.Permissions.Default);
+
var result = await _permissionAppService.GetAsync(ProviderName, ProviderKey);
Groups = ObjectMapper.Map, List>(result.Groups);
}
@@ -38,6 +41,7 @@ namespace Volo.Abp.Permissions.Web.Pages.AbpPermissions
public async Task OnPostAsync()
{
ValidateModel();
+ await CheckPolicyAsync(PermissionPermissions.Permissions.Update);
var updatePermissionDtos = Groups
.SelectMany(g => g.Permissions)