IDataProtector 개체를 생성하였고, 이를 성공적으로 수행하기 위해서는 CreateProtector 메소드가 포함된 IDataProtectionProvider 개체를 필요로 합니다. 이 두개의 인터페이스 모두 Microsoft.AspNetCore.DataProtection 의 namespace 의 일부이므로 using 문을 통해 사용합니다.
이제 guid 인 id 값을 보호하기 위해서 별도로 EncryptedId 속성을 하나 만듭니다.
public class Employee
{
public Guid Id { get; set; }
[Required(ErrorMessage = "Name is required")]
public string Name { get; set; }
[Required(ErrorMessage = "Age is required")]
public int Age { get; set; }
[Required(ErrorMessage = "Account number is required")]
public string AccountNumber { get; set; }
[NotMapped]
public string EncryptedId { get; set; }
}
guid 의 id 값을 foreach 구문을 통해 반복하여 id 값을 Protect() 함수를 통해 암호화 하여 새롭게 만든 속성인 EncryptedId 에 암호 값을 할당합니다.
public IActionResult Index()
{
var employees = _repo.GetAll();
foreach (var emp in employees)
{
var stringId = emp.Id.ToString();
emp.EncryptedId = _protector.Protect(stringId);
}
return View(employees);
}
view 의 list 목록에서 상세보기 링크에 키값이 아닌 암호값을 파라미터로 전송하도록 지정합니다.
설명한 대로보호자 개체(protector object) 를 생성하려면 유형IDataProtectionProvider 와 메서드의 개체가 필요합니다.그러나 메서드CreateProtector 메소드에서 추가 매개변수 값을 볼 수 있습니다. 해당 값을 "Purpose String" 이라고 합니다.
모든 protector에는 고유한 "purpose string" 이 있어야 하며, 암호화(cryptographic) 소비자(consumers) 간에 격리(isolation)를 제공합니다.즉, 두 개의IDataProtector 인스턴스(다른 "purpose string" 로 생성됨)는 서로의 페이로드(payloads) 를 읽을 수 없고 자신의 페이로드(payloads) 만 읽을 수 있습니다.
protector object 가 다른 protector 의 페이로드(payload) 를 읽으려고 하면 예외가 throw됩니다.컨트롤러를 약간 수정해 보겠습니다.
private readonly IEmployeeRepository _repo;
private readonly IDataProtector _protector;
private readonly IDataProtector _protectorTest;
public EmployeesController(IEmployeeRepository repo, IDataProtectionProvider provider)
{
_repo = repo;
_protector = provider.CreateProtector("EmployeesApp.EmployeesController");
_protectorTest = provider.CreateProtector("TestProtector");
}
public IActionResult Index()
{
var employees = _repo.GetAll();
foreach (var emp in employees)
{
var stringId = emp.Id.ToString();
emp.EncryptedId = _protector.Protect(stringId);
}
var testData = _protectorTest.Protect("Test");
var unprotectedTest = _protector.Unprotect(testData);
return View(employees);
}
var testData = _protectorTest.Protect("Test");
var unprotectedTest = _protector.Unprotect(testData);
아래와 같이 payload 값이 달라 오류 발생됩니다.
Data Protection 제한시간 설정하기
보호된 페이로드가 특정 기간 후에 만료되기를 원하는 상황이 있습니다.이를 위해ITimeLimitedDataProtector 인터페이스를 사용할 수 있습니다.이 언급된 인터페이스의 인스턴스를 생성하려면 IDataProtector 의 인스턴스가 있어야 하고,확장 메서드인 ToTimeLmitedDataProtector 으로 호출해야 합니다.
따라서 예제를 통해 시간 제한 페이로드를 생성하는 방법을 알아보겠습니다.
2분 정도 설정을 한 다음에, 3초 후에 이를 호출하게 되면 오류가 발생됩니다.
public IActionResult Index()
{
//Previous code removed for the example clarity
var timeLimitedProtector = _protector.ToTimeLimitedDataProtector();
var timeLimitedData = timeLimitedProtector.Protect("Test timed protector", lifetime: TimeSpan.FromSeconds(2));
//just to test that this action works as long as life-time hasn't expired
var timedUnprotectedData = timeLimitedProtector.Unprotect(timeLimitedData);
Thread.Sleep(3000);
var anotherTimedUnprotectTry = timeLimitedProtector.Unprotect(timeLimitedData);
return View(employees);
}
만료되어 오류 발생되었습니다.
ASP.NET Core 에서 Data Protection 환경 설정 지정하기
asp.net core 에서 startup 클래스에 이를 등록할 수 있습니다. 여기서 PersistKeysToFileSystem 메소드를 사용할 수 있는데요. 이를 실행하면 해당 폴더에 xml 형태의 파이링 존재합니다.