[c#] ASP.NET Core 2.0 인증 미들웨어

Core 1.1에서는 @blowdart의 조언에 따라 맞춤형 미들웨어를 구현했습니다.

https://stackoverflow.com/a/31465227/29821

다음과 같이 작동했습니다.

  1. 미들웨어가 실행되었습니다. 요청 헤더에서 토큰을 가져 왔습니다.
  2. 토큰을 확인하고 유효한 경우 여러 클레임을 포함하는 ID (ClaimsIdentity)를 구축 한 다음 HttpContext.User.AddIdentity ()를 통해 추가했습니다.
  3. services.AddAuthorization을 사용하는 ConfigureServices에서 미들웨어에서 제공하는 클레임을 요구하는 정책을 추가했습니다.
  4. 컨트롤러 / 액션에서 [Authorize (Roles = “미들웨어가 추가 한 일부 역할”)]을 사용합니다.

토큰이 유효하지 않고 (위의 2 단계) 클레임이 추가되지 않은 경우 “No authenticationScheme이 지정되었으며 DefaultChallengeScheme을 찾을 수 없습니다”라는 메시지가 표시된다는 점을 제외하면 2.0에서 다소 작동합니다.

이제 2.0에서 변경된 인증을 읽고 있습니다.

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x

ASP.NET Core 2.0에서 동일한 작업을 수행하는 올바른 경로는 무엇입니까? 진정한 사용자 지정 인증을 수행하는 예가 보이지 않습니다.



답변

따라서이 문제를 해결하기 위해 하루 종일 노력한 끝에 마침내 Microsoft가 코어 2.0에서 새로운 단일 미들웨어 설정을위한 사용자 지정 인증 처리기를 만드는 방법을 알아 냈습니다.

MSDN의 문서를 살펴본 후 인터페이스 AuthenticationHandler<TOption>를 구현 하는 클래스를 찾았습니다 IAuthenticationHandler.

거기에서 기존 인증 체계가있는 전체 코드베이스를 찾았습니다. https://github.com/aspnet/Security

이들 중 하나에서 Microsoft가 JwtBearer 인증 체계를 구현하는 방법을 보여줍니다. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )

그 코드의 대부분을 새 폴더에 복사하고 .NET과 관련된 모든 작업을 지 웠습니다 JwtBearer.

에서 JwtBearerHandler클래스 (연장 AuthenticationHandler<>)에 대한 재정의있다Task<AuthenticateResult> HandleAuthenticateAsync()

사용자 지정 토큰 서버를 통해 클레임을 설정하기 위해 이전 미들웨어에 추가했지만 여전히 권한 문제가 발생 했습니다. 토큰이 유효하지 않고 클레임이 설정되지 않은 경우 200 OK대신 a 를 뱉어 냈습니다 401 Unauthorized.

나는 Task HandleChallengeAsync(AuthenticationProperties properties)어떤 이유로 든 권한을 설정하는 데 사용되는 재정의했다는 것을 깨달았습니다.[Authorize(Roles="")] 컨트롤러에서 .

이 재정의를 제거한 후 코드가 작동 401하고 권한이 일치하지 않을 때 성공적으로 a를 던 졌습니다.

이에서 주요 테이크 아웃 이제 사용자 지정 미들웨어를 사용할 수 있다는 것입니다, 당신은을 통해 구현해야 AuthenticationHandler<>당신은 설정해야 DefaultAuthenticateScheme하고 DefaultChallengeScheme사용하는 경우 services.AddAuthentication(...).

다음은이 모든 것의 예입니다.

Startup.cs / ConfigureServices ()에서 다음을 추가합니다.

services.AddAuthentication(options =>
{
    // the scheme name has to match the value we're going to use in AuthenticationBuilder.AddScheme(...)
    options.DefaultAuthenticateScheme = "Custom Scheme";
    options.DefaultChallengeScheme = "Custom Scheme";
})
.AddCustomAuth(o => { });

Startup.cs / Configure ()에서 다음을 추가합니다.

app.UseAuthentication();

새 파일 CustomAuthExtensions.cs 만들기

public static class CustomAuthExtensions
{
    public static AuthenticationBuilder AddCustomAuth(this AuthenticationBuilder builder, Action<CustomAuthOptions> configureOptions)
    {
        return builder.AddScheme<CustomAuthOptions, CustomAuthHandler>("Custom Scheme", "Custom Auth", configureOptions);
    }
}

새 파일 CustomAuthOptions.cs 만들기

public class CustomAuthOptions: AuthenticationSchemeOptions
{
    public CustomAuthOptions()
    {

    }
}

새 파일 CustomAuthHandler.cs 만들기

internal class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(IOptionsMonitor<CustomAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
        // store custom services here...
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // build the claims and put them in "Context"; you need to import the Microsoft.AspNetCore.Authentication package
        return AuthenticateResult.NoResult();
    }
}


답변

참조하는 기사에서 지적했듯이 Core 1.x에서 Core 2.0으로 Identity에 상당한 변경 사항이 있습니다. 주요 변경 사항은 미들웨어 접근 방식에서 벗어나 사용자 지정 서비스를 구성하기 위해 종속성 주입을 사용하는 것입니다. 이것은 더 복잡한 구현을 위해 Identity를 사용자 정의하는 데 훨씬 더 많은 유연성을 제공합니다. 따라서 위에서 언급 한 미들웨어 접근 방식에서 벗어나 서비스로 이동하고 싶습니다. 이 목표를 달성하려면 참조 문서의 마이그레이션 단계를 따르십시오. app.UseIdentityapp.UseAuthentication 으로 대체하여 시작하십시오 . .UseIdentity 는 더 이상 사용되지 않으며 향후 버전에서 지원되지 않습니다. 사용자 지정 클레임 변환을 삽입하고 클레임에 대한 권한 부여를 수행하는 방법에 대한 전체 예제는이 블로그 게시물보기


답변