ASP에서 권리를 실현하는 기능 표지.NET 네트워크 응용 프로그램
31835 단어 featureflagsapidotnetcode
만약 당신이 API를 개발하고 있다면, JWT 캐리어 영패를 발행해야 할 수도 있습니다.설정NET 신분 관리 사용자는 이미 정해진 것이지만, 더 간단한 방법으로 권한을 관리할 수 있다면?인증된 사용자의 중요한 정보를 전달하고 권한을 즉시 검증할 수 있다면 어떻게 해야 합니까?오늘 당신은 기능 표지를 어떻게 사용하여 이 점을 실현하는지 배울 것이다
기능 플래그 세분화를 사용하면 응용 프로그램에서 어떤 사용자가 어떤 역할에 있는지 추적할 필요가 없습니다.당신이 해야 할 일은 어떤 사용자 식별자를 스플릿 처리에 전달하는 것입니다. 스플릿은 사용자가 권한을 부여받았는지 알려 줍니다.
이전 글에서 우리는 재중에서 특성 표지를 사용하는 것에 대해 토론했다.NET 코어 웹 API는 엔드포인트에 대한 액세스를 제어합니다.이 강좌에서 목표 규칙과 세그먼트가 있는 기능 로고를 사용하여 단점에 대한 접근을 개선할 것입니다.
이전에 식기실 샘플 프로그램
/api/pantry/image
의 단점에 대한 접근은 그것들을 열거나 닫는 것으로 제어되었다.개발진이 단기 개발에 대한 접근을 제한하고 다른 부서에 이 기능을 보여주려고 할 때 도움이 된다.팀이 누군가에게 이 기능이 어떻게 작동하는지 보여주고 싶을 때 수동으로 이 기능을 켜고 끄는 것은 점점 더 많은 시간을 차지할 것이다.항상 이 기능을 켜고 다른 방식으로 접근을 관리하는 것이 좋겠다고 결정했습니다.실행이 아니라NET 신분, 이 항목은 간단한 로그인 시스템을 사용하여 현재 사용자를 추적합니다.
이 글을 따라가려면 다음과 같은 도구가 필요합니다.
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 키로 교체ApiKey
API 키 사본을 가져오려면 왼쪽 위에 있는 아이콘-> 관리 설정-> 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-Type
을 application/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에 대한 몇 가지 다른 장점들입니다. 마음에 드실 거라고 생각합니다.
Reference
이 문제에 관하여(ASP에서 권리를 실현하는 기능 표지.NET 네트워크 응용 프로그램), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/split/implement-feature-flags-for-entitlements-in-asp-net-web-apps-3kao텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)