권한부여: 뷰 기반 권한부여

등록일시: 2017-01-16 11:00,  수정일시: 2017-02-27 11:29
조회수: 3,843
이 문서는 ASP.NET Core 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 MVC의 Razor 뷰에서 UI를 보여주거나, 숨기거나, 변경하기 위해서 권한부여 기능을 사용하는 방법을 살펴봅니다.

개발자의 입장에서는 현재 사용자의 신원(Identity)을 기반으로 UI를 보여주고 숨기거나, 또는 변경해야 하는 경우도 많습니다. 이런 경우, MVC 뷰에서 의존성 주입을 통해서 권한부여 서비스에 접근할 수 있습니다. Razor 뷰에 권한부여 서비스를 주입하려면 @inject IAuthorizationService AuthorizationService 같이 @inject 지시문을 사용하면 됩니다. 권한부여 서비스를 모든 뷰에서 사용하고 싶다면 @inject 지시문을 Views 디렉터리에 위치한 _ViewImports.cshtml 파일에 작성하면 됩니다. 뷰에서 의존성 주입을 사용하는 방법에 대한 더 자세한 정보는 뷰에 서비스 주입하기 문서를 참고하시기 바랍니다.

뷰에 권한부여 서비스를 주입한 뒤에는, 리소스 기반 권한부여 문서에서 검사를 하기 위해서 AuthorizeAsync 메서드를 호출했던 것과 정확하게 동일한 방법으로 메서드를 사용하면 됩니다:

@if (await AuthorizationService.AuthorizeAsync(User, "PolicyName"))
{
    <p>This paragraph is displayed because you fulfilled PolicyName.</p>
}

때로는 권한부여의 대상 리소스로 뷰 모델이 사용될 수도 있습니다. 그런 경우에도 리소스 기반 권한부여 문서에서 검사를 하기 위해 AuthorizeAsync 메서드를 호출했던 것과 같은 방법을 사용하면 됩니다:

@if (await AuthorizationService.AuthorizeAsync(User, Model, Operations.Edit))
{
    <p><a class="btn btn-default" role="button"
        href="@Url.Action("Edit", "Document", new { id = Model.Id })">Edit</a></p>
}

이 코드를 살펴보면 권한부여에서 고려해야 할 리소스로 모델이 전달되고 있음을 확인할 수 있습니다.

경고

권한부여 메서드를 이용해서 UI의 일부분을 보여주거나 숨겼다고 해서 그대로 안심해서는 안됩니다. UI 요소를 숨긴다고 해서 사용자가 리소스에 접근할 수 없다는 뜻은 아닙니다. 반드시 컨트롤러 코드에서도 사용자의 권한을 확인해야만 합니다.