권한부여: 스키마별 신원 제한

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

단일 페이지 응용 프로그램(SPA) 같은 일부 시나리오에서는 동시에 여러 가지 인증 방법이 사용될 수 있습니다. 가령, 어떤 응용 프로그램에서는 로그인은 쿠키 기반의 인증을 수행하고 JavaScript 요청은 전달자(Bearer) 인증을 사용해서 수행합니다. 때로는 인증 미들웨어의 인스턴스가 여러 개일 수도 있습니다. 예를 들어, 기본 신원을 포함하는 쿠키 미들웨어와 사용자가 추가적인 보안이 필요한 작업을 요청해서 다단계 인증(Multi-Factor Authentication)이 발생할 때 생성되는 미들웨어, 이렇게 두 가지 쿠키 미들웨어가 존재하는 경우도 있습니다.

인증 체계(Authentication Schemes)의 이름은 다음과 같이 인증 도중 인증 미들웨어가 구성될 때 지정됩니다:

app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
    AuthenticationScheme = "Cookie",
    LoginPath = new PathString("/Account/Unauthorized/"),
    AccessDeniedPath = new PathString("/Account/Forbidden/"),
    AutomaticAuthenticate = false
});

app.UseBearerAuthentication(options =>
{
    options.AuthenticationScheme = "Bearer";
    options.AutomaticAuthenticate = false;
});

이 예제 구성에서는 쿠키 및 전달자를 위한 두 가지 인증 미들웨어가 추가됩니다.

노트

복수의 인증 미들웨어를 추가할 때는 자동실행되도록 구성된 미들웨어가 존재하면 안됩니다. 이 작업은 AutomaticAuthenticate 옵션 속성을 false로 설정하여 처리할 수 있습니다. 이 설정을 누락할 경우 스키마별 필터링이 정상적으로 동작하지 않을 것입니다.

Authorize 어트리뷰트로 인증 체계 선택하기

모든 인증 미들웨어가 자동으로 실행되거나 신원을 생성해야만 하도록 구성되지 않았으므로, 권한부여 시점에 사용할 미들웨어를 선택하게 됩니다. 권한부여에 사용하고자 하는 미들웨어를 선택하는 가장 간단한 방법은 ActiveAuthenticationSchemes 속성을 사용하는 것입니다. 이 속성은 다음과 같이 쉼표(,)로 연결된 사용할 인증 체계의 목록을 전달 받습니다:

[Authorize(ActiveAuthenticationSchemes = "Cookie,Bearer")]
public class MixedController : Controller

이 예제 코드에서는 쿠키 미들웨어 및 전달자 미들웨어가 모두 실행되어 현재 사용자의 신원을 생성하고 추가할 수 있는 기회를 갖습니다. 반면 단일 인증 체계를 지정하는 경우에는 지정된 미들웨어만 실행됩니다:

[Authorize(ActiveAuthenticationSchemes = "Bearer")]

이 코드의 경우에는 전달자 체계의 미들웨어만 실행되며, 모든 쿠키 기반의 신원들은 무시됩니다.

정책을 이용해서 인증 체계 선택하기

정책을 이용해서 필요한 인증 체계를 지정하는 방식을 선호한다면 정책을 추가할 때 AuthenticationSchemes 컬렉션을 설정할 수 있습니다.

options.AddPolicy("Over18", policy =>
{
    policy.AuthenticationSchemes.Add("Bearer");
    policy.RequireAuthenticatedUser();
    policy.Requirements.Add(new Over18Requirement());
});

이 예제의 Over18 정책은 Bearer 미들웨어에 의해 생성된 신원을 대상으로만 실행됩니다.