ASP에서 권리를 실현하는 기능 표지.NET 네트워크 응용 프로그램

에서 라이센스를 설정한 적이 있습니까?NET ID 관리 내부 또는 실험 기능에 대한 액세스?누가 사용자, 역할, 신분 검증과 단독 신분 데이터베이스 설정을 포함하거나 접근 권한을 가지고 있는지 추적하는 것은 그 자체가 완전한 작업이다.
만약 당신이 API를 개발하고 있다면, JWT 캐리어 영패를 발행해야 할 수도 있습니다.설정NET 신분 관리 사용자는 이미 정해진 것이지만, 더 간단한 방법으로 권한을 관리할 수 있다면?인증된 사용자의 중요한 정보를 전달하고 권한을 즉시 검증할 수 있다면 어떻게 해야 합니까?오늘 당신은 기능 표지를 어떻게 사용하여 이 점을 실현하는지 배울 것이다
기능 플래그 세분화를 사용하면 응용 프로그램에서 어떤 사용자가 어떤 역할에 있는지 추적할 필요가 없습니다.당신이 해야 할 일은 어떤 사용자 식별자를 스플릿 처리에 전달하는 것입니다. 스플릿은 사용자가 권한을 부여받았는지 알려 줍니다.
이전 글에서 우리는 재중에서 특성 표지를 사용하는 것에 대해 토론했다.NET 코어 웹 API는 엔드포인트에 대한 액세스를 제어합니다.이 강좌에서 목표 규칙과 세그먼트가 있는 기능 로고를 사용하여 단점에 대한 접근을 개선할 것입니다.
이전에 식기실 샘플 프로그램 /api/pantry/image 의 단점에 대한 접근은 그것들을 열거나 닫는 것으로 제어되었다.개발진이 단기 개발에 대한 접근을 제한하고 다른 부서에 이 기능을 보여주려고 할 때 도움이 된다.
팀이 누군가에게 이 기능이 어떻게 작동하는지 보여주고 싶을 때 수동으로 이 기능을 켜고 끄는 것은 점점 더 많은 시간을 차지할 것이다.항상 이 기능을 켜고 다른 방식으로 접근을 관리하는 것이 좋겠다고 결정했습니다.실행이 아니라NET 신분, 이 항목은 간단한 로그인 시스템을 사용하여 현재 사용자를 추적합니다.
이 글을 따라가려면 다음과 같은 도구가 필요합니다.
  • .NET Core 3.1
  • Postman
  • A forever-free Split developer account
  • Pro tip: Did you know you can run .NET on Linux and Mac too? The above link has resources for both platforms in addition to Windows.


    ASP의 기능 플래그 사용을 시작합니다.그물심


    Github로 넘어가면 사용 중인 기능 표지가 이전 블로그에서 복제된 식기실 저장소입니다.NET 핵심 웹 API(당신은 강좌를 따라 이 단계를 완성할 필요가 없습니다!)
    프로젝트를 열면 '권한' 이라는 새 지점을 만듭니다.VisualStudio에서 도구 모음에서 Git 를 클릭한 다음 New Branch 를 클릭합니다.명령줄을 사용하는 경우 다음 명령을 사용할 수 있습니다.
    git checkout -b Entitlements
    
    열기appsettings.json 및 SDK API 키로 교체ApiKeyAPI 키 사본을 가져오려면 왼쪽 위에 있는 아이콘-> 관리 설정-> API 키를 클릭합니다.그런 다음 서버측 임시 SDK 키 옆에 있는 복사를 클릭합니다.

    모델에 CurrentUser.cs라는 새 클래스를 추가하고 다음을 포함합니다.
    namespace Pantry.Models
    {
        public class CurrentUser
        {
                public int Id { get; set; }
                public string Username { get; set; }
        }
    }
    
    AppDbContext.cs를 열고 다음을 추가합니다ImageLocations.
    public DbSet<CurrentUser> CurrentUser { get; set; }
    
    Controllers 폴더에 AuthenticateController.cs라는 새 클래스를 만들고 다음을 추가합니다.
    using Microsoft.AspNetCore.Mvc;
    using Pantry.Models;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace Pantry.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class AuthenticateController : ControllerBase
        {
            private readonly AppDbContext Context;
    
            public AuthenticateController(AppDbContext context)
            {
                Context = context;
            }
    
            [HttpPost]
            [Route("login")]
            public async Task<IActionResult> Login(CurrentUser user)
            {
                if (!String.IsNullOrWhiteSpace(user.Username))
                {
                    await Context.CurrentUser.AddAsync(new CurrentUser() { Username = user.Username });
                    await Context.SaveChangesAsync();
    
                    return Ok("Logged In!");
    
                }
    
                return NotFound("User Not Found!");
            }
        }
    }
    
    전체PantryController.cs를 다음 부품으로 교체합니다.
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    using Pantry.Models;
    using Splitio.Services.Client.Interfaces;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace Pantry.Controllers
    {
        [Route("api/[controller]")]
        [ApiController]
        public class PantryController : Controller
        {
            private readonly AppDbContext Context;
            public ISplitClient Client { get; }
            private bool ShowImageLocation
            {
                get { return GetStateOfImageLocation(); }
            }
    
            public PantryController(AppDbContext context, ISplitFactory split)
            {
                Context = context;
    
                var client = split.Client();
                client.BlockUntilReady(10000);
    
                Client = client;
            }
    
            [HttpGet]
            public async Task<ActionResult<IEnumerable<Product>>> GetProducts() => await Context.Products.ToListAsync();
    
            [HttpGet("{id}")]
            public async Task<ActionResult<Product>> GetProduct(int id) => await Context.Products.FindAsync(id) ?? (ActionResult<Product>)NotFound();
    
            [HttpPost]
            public async Task<ActionResult<int>> PostProduct(Product product)
            {
                var entityProduct = await Context.Products.AddAsync(product);
                await Context.SaveChangesAsync();
    
                return entityProduct.Entity.Id;
            }
    
            [HttpDelete("{id}")]
            public async Task<ActionResult> DeleteProduct(int id)
            {
                var product = await Context.Products.FindAsync(id);
                if (product == null)
                {
                    return NotFound();
                }
    
                Context.Products.Remove(product);
                await Context.SaveChangesAsync();
    
                return Ok();
            }
    
            [HttpGet("/api/[controller]/image")]
            public async Task<ActionResult<ImageLocation>> GetProductImages(int id)
            {
                if (CurrentUserIsAuthorized())
                {
                    if (ShowImageLocation is false)
                    {
                        return NotFound();
                    }
    
                    var output = await Context.ImageLocations.FindAsync(id);
    
                    return output;
                }
    
                return Unauthorized();
            }
    
            [HttpGet("/api/[controller]/image/{id}")]
            public async Task<ActionResult<ImageLocation>> GetProductImage(int id)
            {
                if (CurrentUserIsAuthorized())
                {
                    if (ShowImageLocation is false)
                    {
                        return NotFound();
                    }
    
                    return await Context.ImageLocations.FindAsync(id);
                }
    
                return Unauthorized();
            }
    
            [HttpPost("/api/[controller]/image")]
            public async Task<ActionResult<int>> PostProductImage(ImageLocation imageLocation)
            {
                if (CurrentUserIsAuthorized())
                {
                    if (ShowImageLocation is false)
                    {
                        return NotFound();
                    }
    
                    var entityProduct = await Context.ImageLocations.AddAsync(imageLocation);
                    await Context.SaveChangesAsync();
    
                    return entityProduct.Entity.Id;
                }
    
                return Unauthorized();
            }
    
            private bool GetStateOfImageLocation()
            {
                var treatment = Client.GetTreatment("Default_Value", "Pantry_API_ImageLocation");
    
                if (treatment == "on")
                {
                    return true;
                }
    
                if(treatment == "off")
                {
                    return false;
                }
    
                throw new System.Exception("Something went wrong!");
            }
    
            private bool CurrentUserIsAuthorized()
            {
                var currentUser = Context.CurrentUser.FirstOrDefault();
                if (currentUser != null)
                {
                    var treatment = Client.GetTreatment(currentUser.Username, "Pantry_API_Entitlements");
    
                    if (treatment == "on")
                    {
                        return true;
                    }
                }
    
                return false;
            }
        }
    }
    

    ASP에 기능 플래그를 추가합니다.네트워크 핵심 응용


    권한을 처리하기 위해 새로운 치료와 세분화를 만들어야 합니다.
    버스트 계정에 로그인한 다음 왼쪽의 Segments를 클릭합니다.Create Segment 를 클릭하고 Sales 로 이름을 지정한 다음 Create 를 클릭합니다.환경이 Staging-Default로 설정되어 있는지 확인합니다.클릭Add definition.사용자 섹션의 새 페이지에서 Add User를 클릭한 다음 Add User Individually를 클릭합니다.사용자 목록에 Sarah를 추가하고 확인을 클릭합니다.


    현재 일부 사용자가 있습니다. 권한 수여 검사를 처리하는 처리를 만들어야 합니다.왼쪽에서 버스트 를 클릭합니다.Create split를 클릭하고 이름을 Pantry_API_Entitlements로 지정하고 user 드롭다운 목록에서 Traffic Type를 선택한 다음 만들기를 클릭합니다.
    Add Rules를 클릭하고 아래로 스크롤Set targeting rules하고 Add rule를 클릭합니다.기본 규칙은 세분 시장에서 사용자를 찾았기 때문에 아래 목록에서 Sales를 선택하고 서버를 on 로 변경한 다음 오른쪽 상단의savechanges를 누르십시오.변경 요약 페이지로 이동합니다. 이 페이지에서 확인을 클릭하여 변경 사항을 적용할 수 있습니다.

    ASP에 테스트를 추가합니다.네트워크 핵심 응용


    프로젝트를 시작하고 프로그램이 사용하는 포트를 기록합니다.다음 API에 대한 대체 포트 번호를 호출해야 할 수도 있습니다.

    Note: If you’re using VS Code and the command line use dotnet run


    Postman을 열고 새 POST 탭을 작성합니다.
    전화할 모든 POST 전화의 제목Content-Typeapplication/json로 변경해야 합니다.선택을 취소하고 목록 밑에 새 것을 만들어야 할 수도 있습니다.
    첫 번째 POST 통화Content-Type에 대해 Body에서 http://localhost:37095/api/pantry를 선택하고 다음을 추가합니다.
    {
      "id": 1,
      "name": "Cereal",
      "expiration": "2022-01-01T00:00:00",
      "weight": 1,
      "count": 1
    }
    
    클릭하여 발송.HTTP 상태raw와 응답200을 받아야 합니다.
    처음 받으려면 1로 전화하십시오.
    현재 http://localhost:37095/api/pantry를 사용하여 이전과 같이 다른 게시물을 만듭니다.
    {
      "id": 1,
      "location": "/somewhere"
    }
    
    클릭하여 발송.HTTP 상태http://localhost:37095/api/pantry/image와 오류 응답을 받아야 합니다.왜?팀원들은 치료만 받을 수 있습니다.너는 심지어 아직 로그인도 하지 않았는데, 시스템도 네가 누군지 모른다.
    {
        "type": "https://tools.ietf.org/html/rfc7235#section-3.1",
        "title": "Unauthorized",
        "status": 401,
        "traceId": "|980220d1-4ab6a5bca9342aa9."
    }
    
    401 및 다음 json을 사용하여 새 게시물을 만듭니다.
    {
        "username":"Sarah"
    }
    
    클릭하여 발송.HTTP 상태http://localhost:37095/api/authenticate/login와 응답을 받아야 합니다.
    Logged In!
    
    게시물을 다시 200에 반환하고 보내면 HTTP 상태http://localhost:37095/api/pantry/image와 응답200을 받을 수 있습니다.
    마지막으로 1를 사용하여 제품 ID에 따라 특정 이미지 위치를 가져오는 또 다른 GET를 생성합니다.
    로그인하면 HTTP 상태http://localhost:37095/api/pantry/image/1와 다음 응답이 제공됩니다.
    [
        {
            "id": 1,
            "name": "Cereal",
            "expiration": "2022-01-01T00:00:00",
            "weight": 10,
            "count": 1
        }
    ]
    
    치료를 끄라고!
    버스트로 이동하여 200를 클릭합니다.아래에서 Pantry_API_Entitlements까지 스크롤하여 Set targeting rules열기에서 닫기로 변경합니다.오른쪽 상단에 있는 변경 내용 저장 을 클릭하고 변경 요약 페이지가 열리면 아래쪽에 있는 확인 을 클릭합니다.

    로그인하여 올바른 세그먼트에 있는 경우에도 이미지 끝점에 액세스할 수 없습니다.

    기능 표지, 안전 권한 수여 등에 대한 더 많은 정보


    현재, 당신은 세분 시장에 사용자를 추가하여 기능에 대한 접근을 제어할 수 있습니다.더 좋은 것은 코드를 작성하는 데 전념할 때 다른 사람들이 그것을 세션에 추가할 수 있다는 것이다.스플릿의 가장 큰 장점은 응용 프로그램에서 관리층이 제어할 수 있는 기능을 만들 수 있다는 것이다.경험적으로 어떤 것들을 만들고 수동으로 편집하고 설정할 필요가 없는 것보다 더 좋은 느낌은 없다.
    다음은 Split에 대한 몇 가지 다른 장점들입니다. 마음에 드실 거라고 생각합니다.
  • How to Structure Feature Flags for Entitlements
  • 7 Ways Feature Flags Improve Software Development
  • Introducing the Split CLI
  • 여느 때와 마찬가지로, 만약 당신이 더 많은 유사한 재미있는 내용을 찾고 있다면, 우리는 당신이 트위터에서 우리를 주목하고 우리의 사이트를 구독하도록 기꺼이 하겠습니다

    좋은 웹페이지 즐겨찾기