ASP.NET Core 2.0 인증 미들웨어


89

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에서 동일한 작업을 수행하는 올바른 경로는 무엇입니까? 진정한 사용자 지정 인증을 수행하는 예가 보이지 않습니다.


이 두 제도라고하더라도,이 링크를 시도하지만, u는 인증에 이끌고 줄 것 wildermuth.com/2017/08/19/...
Mithun Pattankar

우리가 살펴볼 수 있도록 코드를 추가해 주시겠습니까? 나는 내가 core2.0에서 JWT에 문제가 있다는 것을 안다 – 스타트 업에서 그것을 이동하는 경우였다
Webezine

답변:


194

따라서이 문제를 해결하기 위해 하루 종일 노력한 끝에 마침내 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();
    }
}

1
좋은 게시물이지만 코드를 컴파일하는 데 몇 가지 문제가 있습니다. CustomAuthOptions 및 AuthenticateResult 유형이 누락되었습니다. 그것들을 게시 할 수 있습니까?
alexb

8
Github 리포지토리의 코드로 결론을 공유 하시겠습니까?
CSharper

2
당신이 설명해 주시겠습니까 DefaultAuthenticateSchemeDefaultChallengeScheme? 둘 다 사용되는 이유를 이해하지 못합니까? 그리고 그들 사이의 차이점은 무엇입니까.
Mohammed Noureldin

11
+1 "그곳에서 github.com/aspnet/Security 에있는 기존 인증 체계가있는 전체 코드베이스를 찾았습니다 ." 이 (정말 우수한) 답변과 함께 ASP.NET 팀이 어떻게 수행하는지 살펴보십시오. 우리 중 누구라도 언젠가 MS 코드와 관행에 대한 질문을하고 대답은 "그냥 그들의 코드베이스를 살펴볼 것"이라고 생각한 적이 있습니까?
Marc L.

3
나중에 오는 다른 사용자의 AuthExtension경우 Microsoft.Extensions.DependencyInjection네임 스페이스 내부에 있어야 합니다. 이 예를 참조하십시오. github.com/aspnet/Security/blob/rel/2.0.0/src/…
Garry Polley

4

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


12
WebAPI 앱에서 이것을 사용하는 방법에 대한 예가 있습니까?
alexb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.