의 액세스 제어 목록입니다.순 C#

에서 액세스 제어 목록을 실행하는 방법에 대한 설명서입니다.NET C#(소형 라이브러리 및 코드 예제 포함)


배경 이야기


제 경력에서 저는 사용자가 가진 역할/권한에 따라 일부 기능을 실시하여 일부 사용자의 자원이나 루트를 제한해야 합니다.그래서 저는 제 경험을 공유하고 작은 라이브러리를 개발하여 누구나 응용 프로그램의 역할과 권한에 따라 액세스 제어를 쉽게 통합할 수 있도록 하겠습니다.
파일 시스템 및 네트워크 권한에 주로 사용되는 ACL(액세스 제어 목록) 방법을 따르는 Nodejs 기반 라이브러리의 지침을 따르기로 결정했습니다.

ACL(액세스 제어 목록)이란?


ACL(Access Control List)에는 특정 디지털 환경에 대한 액세스를 부여하거나 거부하는 규칙이 포함되어 있습니다.
ACL은 컴퓨터 운영 체제/어플리케이션 사용자에게 시스템 객체, 리소스, 파일 또는 파일 디렉토리에 대한 액세스 권한을 알려주는 테이블입니다.각 객체에는 액세스 제어 목록에 연결하는 보안 속성이 있습니다.이 목록은 시스템 액세스 권한을 가진 모든 사용자에게 항목을 제공합니다.
사용자가 ACL 기반 보안 모델에서 객체를 요청하면 운영 체제나 응용 프로그램에서 ACL의 관련 항목을 검토하고 요청된 작업이 허용되는지 확인합니다.
참고 링크에서 더 많은 내용을 읽을 수 있습니다
  • https://www.imperva.com/learn/data-security/access-control-list-acl/
  • https://en.wikipedia.org/wiki/Access-control_list
  • https://www.twingate.com/blog/access-control-list/
  • 어디에서 사용합니까?


    이 라이브러리의 표준 장면을 사용하는 것은 백엔드 서비스를 개발할 때이지만, 추가 보호가 필요한 모든 종류의 응용 프로그램에도 사용할 수 있습니다.
    특히 백엔드 서비스에서는 각 엔드포인트의 리소스와 권한에 대한 포맷 라우팅 엔드포인트를 확인할 수 있도록 이 도구를 사용합니다.
    예를 들어, 권한은 HTTP 메서드와 라우팅의 첫 번째 단어에 대한 리소스에 의해 결정됩니다.

    GET /{resource}/something-else


    GET 매핑은 보기, POST 매핑은 생성, PUT 및 Update 매핑은 업데이트, DELETE 매핑은 삭제

    PUT /users/{userId}


    따라서 이 경우 사용자는 자원 사용자와 함께 작업할 수 있는 역할을 가지고 이 단점을 실행할 수 있도록 업데이트할 수 있는 권한을 가져야 한다.

    사용법


    먼저 Acl.Net 라이브러리를 다운로드 및/또는 설치해야 합니다.너는 Github/Acl.Net 또는 NuGet에서 그것을 찾을 수 있다. 왜냐하면 그것은 마성이공대학의 허가증 아래 있기 때문에 완전히 무료이며 사용할 수 있기 때문이다.

    NuGet 패키지 관리자를 통해 설치:



    이제 재미있는 부분이 시작된다.
    현재 이 라이브러리는 3가지 상태 지속화 옵션을 제공합니다.향후 추가적인 저축 옵션과 사용자 고유의 확장 옵션이 있을 수 있습니다.
  • InMemory: 메모리의 지속성을 제공하므로 애플리케이션이 살아 있는 동안에도 정보가 유지됩니다.
  • Redis: Redis 데이터베이스에 대한 지속성을 제공합니다.
  • Mongodb: Mongodb 데이터베이스의 지속성을 제공합니다.
  • 자세한 내용 및 click here. 사용 방법

    Mongodb 스토리지 사용


    이 예에서는 몬godb 백엔드를 정의하여 Acl 컨트롤러에 전달합니다.그런 다음 사용자 및 장치 리소스에 대해 사용 권한이 있는 관리자 역할을 만들고(허용) 사용자 "YourUser"(식별자는 문자열 또는 정수일 수 있음) 할당(추가)합니다.이후 사용자가 대상 리소스에 대한 권한이 있으면 일련의 검사가 수행됩니다.
    using Acl.Net.Backends;
    using Acl.Net.Entities;
    using Acl.Net.Interfaces;
    using MongoDB.Driver;
    
    namespace ConsoleApp
    {
        internal class Program
        {
            static void Main()
            {
                string mongoUrl = "mongodb://localhost:27017/Acl";
                string databaseName = "Acl";
                MongoClient db = new MongoClient(mongoUrl);
                IBackend backend = new Mongodb(db, databaseName);
                IAcl acl = new Acl.Net.Acl(backend);
    
                acl.Allow(
                        new Role()
                        {
                            Name = "Administrator",
                            Resources = new[]
                            {
                                new Resource()
                                {
                                    Name = "Users",
                                    Permissions = new[] { "View", "Create", "Update", "Delete" }
                                },
                                 new Resource()
                                {
                                    Name = "Devices",
                                    Permissions = new[] { "View", "Create", "Update" }
                                }
                            }
                        }
                    );
    
                string username = "YourUser";
    
                acl.AddUserRole(username, "Administrator");
    
                bool isAllowedToViewAndCreateUsers = acl.IsAllowed(username, new Resource() { Name = "Users", Permissions = new[] { "View", "Create" } });
                // Result: True
    
                bool isAllowedDeleteUsers = acl.IsAllowed(username, new Resource() { Name = "Users", Permissions = new[] { "Delete" } });
                // Result: True
    
                bool isAllowedDeleteDevices = acl.IsAllowed(username, "Devices", "Delete");
                // Result: False
    
                bool isAllowedViewDevices = acl.IsAllowed(username, "Devices", "View");
                // Result: True
            }
        }
    }
    

    ASP에서의 사용법.NET 코어 웹 API, Mongodb 스토리지를 중간부품으로


    이곳의 생각은 위의 예와 같다.요청한 사용자가 요청한 자원에 접근할 권리가 있는지 확인하는 중간부품이 있습니다.사용자가 이 자원에 접근할 수 없으면, 이 중간부품은 컨트롤러 앞에서 실행되며, 논리적 실행을 막습니다.
    사용자 식별자는 JWT 토큰의 암호 해독, 인증 헤드 또는 응용 프로그램 태그를 통해 사용자를 인증하는 다른 방법으로 얻을 수 있습니다.
    다음 예제에서는 as middleware을 사용하는 방법을 보여 줍니다.
    using Acl.Net.Backends;
    using Acl.Net.Interfaces;
    using Microsoft.AspNetCore.Http;
    using MongoDB.Driver;
    using System.Net;
    using System.Threading.Tasks;
    
    namespace WebApplication
    {
        public class PermissingGuardMiddleware
        {
            private readonly RequestDelegate _next;
            private readonly Acl.Net.Acl _acl;
    
            public PermissingGuardMiddleware(RequestDelegate next)
            {
                string mongoUrl = "mongodb://localhost:27017/Acl";
                string databaseName = "Acl";
                MongoClient db = new MongoClient(mongoUrl);
                IBackend backend = new Mongodb(db, databaseName);
                this._acl = new Acl.Net.Acl(backend);
    
                _next = next;
            }
    
            public async Task InvokeAsync(HttpContext context)
            {
                string authHeader = context.Request.Headers["Authentication"].ToString();
                string[] paths = ((string)context.Request.Path).Split('/');
                string permission = TransforMethodToPermission(context.Request.Method);
    
                if (permission == null || paths[0] == null)
                {
                    await Unauthorize(context);
                    return;
                }
    
                try
                {
                    bool isAllowed = this._acl.IsAllowed(authHeader, paths[0], permission);
                    if (!isAllowed)
                    {
                        await Unauthorize(context);
                        return;
                    }
    
                    await _next(context);
                }
                catch (System.Exception)
                {
                    await Unauthorize(context);
                    return;
                }
            }
    
            private string TransforMethodToPermission(string method)
            {
                switch (method.ToUpper())
                {
                    case "POST":
                        return "Creare";
                    case "GET":
                        return "View";
                    case "DELETE":
                        return "Delete";
                    case "PUT":
                    case "UPDATE":
                        return "Update";
                    default:
                        return null;
                }
            }
    
            private async Task Unauthorize(HttpContext context)
            {
                context.Response.Clear();
                context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                await context.Response.WriteAsync("Unauthorized");
            }
        }
    }
    

    문서


    도서관, 방법 및 가능성에 대한 자세한 내용은 다음을 참조하십시오.
  • https://vnedyalkov91.github.io/Acl.Net/
  • https://github.com/vnedyalkov91/Acl.Net
  • https://www.nuget.org/packages/Acl.Net/
  • 마지막 말


    이렇게, 네가 이 이야기를 읽는 것이 내가 쓴 것처럼 재미있기를 바란다.
    나도 너희들 중에서 비슷한 문제를 겪고 해결 방안을 찾고 있는 사람들에게 도움을 줄 수 있기를 바란다.

    좋은 웹페이지 즐겨찾기