따라서이 문제를 해결하기 위해 하루 종일 노력한 끝에 마침내 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 =>
{
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)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
return AuthenticateResult.NoResult();
}
}