ASP.NET Core에서 특정 체계를 사용 하 여 권한 부여Authorize with a specific scheme in ASP.NET Core

SPAs (단일 페이지 응용 프로그램)와 같은 일부 시나리오에서는 여러 인증 방법을 사용 하는 것이 일반적입니다.In some scenarios, such as Single Page Applications (SPAs), it's common to use multiple authentication methods. 예를 들어 앱은 쿠키 기반 인증을 사용 하 여 JavaScript 요청에 대해 로그인 및 JWT 전달자 인증을 사용할 수 있습니다.For example, the app may use cookie-based authentication to log in and JWT bearer authentication for JavaScript requests. 경우에 따라 앱에 인증 처리기의 인스턴스가 여러 개 있을 수 있습니다.In some cases, the app may have multiple instances of an authentication handler. 예를 들어, 하나는 기본 id를 포함 하 고 다른 하나는 MFA (multi-factor authentication)가 트리거될 때 생성 되는 두 개의 쿠키 처리기입니다.For example, two cookie handlers where one contains a basic identity and one is created when a multi-factor authentication (MFA) has been triggered. 사용자가 추가 보안이 필요한 작업을 요청 하 여 MFA를 트리거할 수 있습니다.MFA may be triggered because the user requested an operation that requires extra security.

인증 체계는 인증 중에 인증 서비스가 구성 될 때 이름이 지정 됩니다.An authentication scheme is named when the authentication service is configured during authentication. 예를 들어 다음과 같은 가치를 제공해야 합니다.For example:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication()
        .AddCookie(options => {
            options.LoginPath = "/Account/Unauthorized/";
            options.AccessDeniedPath = "/Account/Forbidden/";
        })
        .AddJwtBearer(options => {
            options.Audience = "http://localhost:5001/";
            options.Authority = "http://localhost:5000/";
        });

위의 코드에서 두 개의 인증 처리기가 추가 되었습니다. 하나는 쿠키이 고 하나는 전달자 용입니다.In the preceding code, two authentication handlers have been added: one for cookies and one for bearer.

참고

기본 체계를 지정 하면 HttpContext.User 속성이 해당 id로 설정 됩니다.Specifying the default scheme results in the HttpContext.User property being set to that identity. 이 동작이 필요 하지 않은 경우에는 매개 변수가 없는 형식의 AddAuthentication를 호출 하 여 사용 하지 않도록 설정 합니다.If that behavior isn't desired, disable it by invoking the parameterless form of AddAuthentication.

권한 부여 특성이 있는 체계 선택Selecting the scheme with the Authorize attribute

권한 부여 시점에서 앱은 사용할 처리기를 나타냅니다.At the point of authorization, the app indicates the handler to be used. 쉼표로 구분 된 인증 스키마 목록을 [Authorize]에 전달 하 여 앱에 권한을 부여 하는 처리기를 선택 합니다.Select the handler with which the app will authorize by passing a comma-delimited list of authentication schemes to [Authorize]. [Authorize] 특성은 기본적으로 구성 되어 있는지 여부에 관계 없이 사용할 인증 체계 또는 체계를 지정 합니다.The [Authorize] attribute specifies the authentication scheme or schemes to use regardless of whether a default is configured. 예를 들어 다음과 같은 가치를 제공해야 합니다.For example:

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
    // Requires the following imports:
    // using Microsoft.AspNetCore.Authentication.Cookies;
    // using Microsoft.AspNetCore.Authentication.JwtBearer;
    private const string AuthSchemes =
        CookieAuthenticationDefaults.AuthenticationScheme + "," +
        JwtBearerDefaults.AuthenticationScheme;

앞의 예제에서는 쿠키와 전달자 처리기를 실행 하 고 현재 사용자에 대 한 id를 만들고 추가할 수 있습니다.In the preceding example, both the cookie and bearer handlers run and have a chance to create and append an identity for the current user. 단일 스키마만 지정 하면 해당 처리기가 실행 됩니다.By specifying a single scheme only, the corresponding handler runs.

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]
public class MixedController : Controller

위의 코드에서는 "전달자" 체계가 있는 처리기만 실행 됩니다.In the preceding code, only the handler with the "Bearer" scheme runs. 쿠키 기반 id는 무시 됩니다.Any cookie-based identities are ignored.

정책을 사용 하 여 체계 선택Selecting the scheme with policies

정책에서 원하는 스키마를 지정 하려는 경우 정책을 추가할 때 AuthenticationSchemes 컬렉션을 설정할 수 있습니다.If you prefer to specify the desired schemes in policy, you can set the AuthenticationSchemes collection when adding your policy:

services.AddAuthorization(options =>
{
    options.AddPolicy("Over18", policy =>
    {
        policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
        policy.Requirements.Add(new MinimumAgeRequirement());
    });
});

위의 예제에서 "Over18" 정책은 "전달자" 처리기에서 만든 id에 대해서만 실행 됩니다.In the preceding example, the "Over18" policy only runs against the identity created by the "Bearer" handler. [Authorize] 특성의 Policy 속성을 설정 하 여 정책을 사용 합니다.Use the policy by setting the [Authorize] attribute's Policy property:

[Authorize(Policy = "Over18")]
public class RegistrationController : Controller

여러 인증 체계 사용Use multiple authentication schemes

일부 앱은 여러 유형의 인증을 지원 해야 할 수 있습니다.Some apps may need to support multiple types of authentication. 예를 들어 앱이 사용자 데이터베이스에서 Azure Active Directory 사용자를 인증할 수 있습니다.For example, your app might authenticate users from Azure Active Directory and from a users database. 또 다른 예로 Active Directory Federation Services 및 Azure Active Directory B2C에서 사용자를 인증 하는 앱이 있습니다.Another example is an app that authenticates users from both Active Directory Federation Services and Azure Active Directory B2C. 이 경우 앱은 여러 발급자의 JWT 전달자 토큰을 수락 해야 합니다.In this case, the app should accept a JWT bearer token from several issuers.

수락 하려는 모든 인증 스키마를 추가 합니다.Add all authentication schemes you'd like to accept. 예를 들어 Startup.ConfigureServices의 다음 코드는 발급자가 서로 다른 두 개의 JWT 전달자 인증 체계를 추가 합니다.For example, the following code in Startup.ConfigureServices adds two JWT bearer authentication schemes with different issuers:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://localhost:5000/identity/";
        })
        .AddJwtBearer("AzureAD", options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://login.microsoftonline.com/eb971100-6f99-4bdc-8611-1bc8edd7f436/";
        });
}

참고

JwtBearerDefaults.AuthenticationScheme기본 인증 체계를 사용 하 여 JWT 전달자 인증을 하나만 등록 합니다.Only one JWT bearer authentication is registered with the default authentication scheme JwtBearerDefaults.AuthenticationScheme. 추가 인증은 고유한 인증 체계를 사용 하 여 등록 해야 합니다.Additional authentication has to be registered with a unique authentication scheme.

다음 단계는 두 인증 체계를 모두 허용 하도록 기본 권한 부여 정책을 업데이트 하는 것입니다.The next step is to update the default authorization policy to accept both authentication schemes. 예를 들어 다음과 같은 가치를 제공해야 합니다.For example:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthorization(options =>
    {
        var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
            JwtBearerDefaults.AuthenticationScheme,
            "AzureAD");
        defaultAuthorizationPolicyBuilder = 
            defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
        options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
    });
}

기본 권한 부여 정책이 재정의 되 면 컨트롤러에서 [Authorize] 특성을 사용할 수 있습니다.As the default authorization policy is overridden, it's possible to use the [Authorize] attribute in controllers. 그러면 컨트롤러는 첫 번째 또는 두 번째 발급자가 발급 한 JWT를 사용 하 여 요청을 수락 합니다.The controller then accepts requests with JWT issued by the first or second issuer.