Scorpio 授权

本文介绍了 Scorpio 审计 (Scorpio.Authorization) 并提供有关使用方法的指南。

简介

授权用于检查是否允许用户在应用程序中执行某些特定操作。

Scorpio 为您提供了基于权限模型的灵活的授权系统,您可以很简单的将 Scorpio 的授权系统和ASP.NET Core 的授权系统集成,并在您的应用服务中使用授权系统,为您的应用服务提供可达到代码级别的授权管理。

授权管理

在 Scorpio 您可以使用 IAuthorizationManager 控制授权,也可以在打开 Aspect 后,使用 AuthorizeAttribute 特性控制授权。

您可以使用 IAuthorizationManager 在您的代码中有条件的控制授权。如:

public async Task CreateAsync(CreateAuthorDto input)
{
    await _authorizationManager.AuthorizeAsync(false,"Author_Management_Create_Books");
    
    //continue to the normal flow...
}

权限管理

权限系统是为特定用户,角色或客户端授权或禁止的简单策略。Scorpio 为您提供了完整的权限模型,您可以很简单的定义您的权限模型。

定义权限

您可以通过创建一个实现了 IPermissionDefinitionProvider 接口的类来注入您的权限定义。

using Scorpio.Authorization.Permissions;

namespace Scorpio.Sample.Authroization.Permissions
{
    public class SamplePermissionDefinitionProvider : IPermissionDefinitionProvider
    {
        public override void Define(IPermissionDefinitionContext context)
        {
            var myGroup = context.AddGroup("SampleGroup");

            myGroup.AddPermission("Author_Management_Create_Books");
        }
    }
}

你需要在 Define 方法中添加权限组或者获取已存在的权限组,并向权限组中添加权限。

Scorpio 会自动发现并注入这个类,您需要在 PermissionOptions.DefinitionProviders 中添加您的提供者 !

context.Services.Configure<PermissionOptions>(opt=>
            {
                opt.DefinitionProviders.Add<SamplePermissionDefinitionProvider>();
            });

权限授予提供者

Scorpio 并没有内置权限授予逻辑,您需要自己通过实现 IPermissionGrantingProvider 来完成权限的授予。如:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace Scorpio.Authorization.Permissions
{
    class RoleBasePermissionGrantingProvider : IPermissionGrantingProvider
    {
        public string Name { get; } = "RoleBaseProvider";

        public Task<PermissionGrantingInfo> GrantAsync(PermissionGrantingContext context)
        {
            var success = context.Principal.IsInRole(context.Permission.Name);
            return Task.FromResult(new PermissionGrantingInfo(success,Name));
        }
    }
}

Scorpio 会自动发现并注入这个类,您需要在 PermissionOptions.GrantingProviders 中添加您的提供者 !

context.Services.Configure<PermissionOptions>(opt=>
            {
                opt.GrantingProviders.Add<RoleBasePermissionGrantingProvider>();
            });