ASP.NET Core를 위한 사용하기 쉽고 매우 가벼운 Microsoft 스타일 기본 체계 인증 구현입니다.
GitHub에서 보기
.NET Framework 4.6.1 및/또는 NetStandard 2.0 이상
다중 타겟: net8.0; net7.0; net6.0; net5.0; 넷코어앱3.1; 넷코어앱3.0; netstandard2.0; net461
이 라이브러리는 NuGet에 게시되어 있습니다. 따라서 코드를 사용자 지정 변경하지 않고 사용하려는 경우 NuGet 패키지를 프로젝트에 직접 설치할 수 있습니다.
아래 링크에서 직접 다운로드하세요. 이전 패키지는 더 이상 사용되지 않으므로 새 패키지를 다운로드하는 것을 고려해 보십시오.
새 패키지 링크 - AspNetCore.Authentication.Basic.
이전 패키지 링크 - Mihir.AspNetCore.Authentication.Basic.
또는 프로젝트에서 아래 명령을 실행합니다.
PM> Install-Package AspNetCore.Authentication.Basic
샘플은 샘플 디렉터리에서 사용할 수 있습니다.
설정은 매우 간단합니다. 이 라이브러리를 사용하려면 ASP.NET Core 2.0 이상에 대한 기본 실무 지식이 필요합니다.
이 라이브러리를 사용하여 작업을 수행하는 방법에는 두 가지가 있습니다. 필요한 경우 두 가지 방법을 혼합할 수 있습니다.
1] IBasicUserValidationService 구현 사용
2] Microsoft 인증 라이브러리에서 찾을 수 있는 것과 동일한 접근 방식인 BasicOptions.Events (OnValidateCredentials 대리자) 사용
참고:
SuppressWWWAuthenticateHeader가 설정되지 않은 경우 옵션에서 Realm을 설정해야 합니다.
IBasicUserValidationService 인터페이스의 구현이 사용되고 BasicOptions.Events.OnValidateCredentials 위임도 설정된 경우 이 위임이 먼저 사용됩니다.
기본 인증을 사용할 때는 항상 프로덕션 환경에서 HTTPS(SSL 인증서) 프로토콜을 사용하십시오.
using AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// SuppressWWWAuthenticateHeader가 설정되지 않은 경우 옵션에 Realm을 설정해야 합니다.// 옵션과 함께 IBasicUserValidationService 인터페이스 구현을 사용하는 경우 .Events.OnValidateCredentials 위임도 설정되어 있으면 이 위임이 사용됩니다. first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// 유형 매개변수가 없는 아래 AddBasic에는 options.Events.OnValidateCredentials 삭제를 설정해야 합니다.//.AddBasic(options => { options.Realm = "My App"; }) ;// 유형 매개변수가 있는 아래 AddBasic은 BasicUserValidationService를 종속성 컨테이너에 추가합니다. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddControllers();//// 기본적으로 ASP.NET Core의 기본 의도인 모든 요청에 대해 인증이 요구되지 않습니다. 동작.//// 따라서 모든 요청에 대해 인증을 요청하려면 아래 FallbackPolicy 옵션을 사용하세요.//services.AddAuthorization(options =>//{// options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();//});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseHttpsRedirection();// 파이프라인 체인의 아래 순서는 다음과 같습니다. important!app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
using AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// SuppressWWWAuthenticateHeader가 설정되지 않은 경우 옵션에 Realm을 설정해야 합니다.// 옵션과 함께 IBasicUserValidationService 인터페이스 구현을 사용하는 경우 .Events.OnValidateCredentials 위임도 설정되어 있으면 이 위임이 사용됩니다. first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// 유형 매개변수가 없는 아래 AddBasic에는 options.Events.OnValidateCredentials 삭제를 설정해야 합니다.//.AddBasic(options => { options.Realm = "My App"; }) ;// 유형 매개변수가 있는 아래 AddBasic은 BasicUserValidationService를 종속성 컨테이너에 추가합니다. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddMvc();//// 기본적으로 ASP.NET Core의 기본 의도인 모든 요청에 대해 인증이 요구되지 않습니다. 행동.//// 따라서 모든 요청에 대해 인증을 요청하려면 위의 services.AddMvc() 대신 아래 옵션을 사용하십시오.//services.AddMvc(options => //{// options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));//});}public void Configure(IApplicationBuilder 앱, IHostingEnvironment env){app.UseAuthentication( );app.UseMvc();}}
AspNetCore.Authentication.Basic 사용;공용 클래스 BasicUserValidationService: IBasicUserValidationService{비공개 읽기 전용 ILogger<BasicUserValidationService> _logger;비공개 읽기 전용 IUserRepository _userRepository;공용 BasicUserValidationService(ILogger<BasicUserValidationService> 로거, IUserRepository userRepository){_logger = logger;_userRepository = userRepository;}public async Task<bool> IsValidAsync(string 사용자 이름, 문자열 비밀번호){try{// 참고: 이 구현을 사용하지 마세요. 이는 데모 목적으로만 사용됩니다.// 여기에 구현을 작성하고 유효성 검사에 따라 true 또는 false를 반환합니다. isValid;}catch(예외 e){_logger.LogError(e, e.Message);throw;}}}
SuppressWWWAuthenticateHeader가 true로 설정되지 않은 경우 설정해야 합니다. 인증되지 않은 요청에 도전할 때 WWW-Authenticate 응답 헤더와 함께 사용됩니다.
기본값은 거짓입니다.
true로 설정하면 인증되지 않은 요청에 도전할 때 WWW-Authenticate 응답 헤더를 반환하지 않습니다.
false로 설정하면 인증되지 않은 요청에 도전할 때 WWW-Authenticate 응답 헤더를 반환합니다.
기본값은 거짓입니다.
true로 설정된 경우 엔드포인트의 컨트롤러 작업 또는 메타데이터에 대한 AllowAnonymous 필터가 있는지 확인합니다. 발견된 경우 요청 인증을 시도하지 않습니다.
기본 인증 미들웨어에서 발생하는 이벤트를 처리하기 위해 애플리케이션에서 제공하는 개체입니다.
애플리케이션은 인터페이스를 완전히 구현할 수도 있고, BasicEvents의 인스턴스를 생성하고 처리하려는 이벤트에만 대리자를 할당할 수도 있습니다.
이 속성에 할당된 대리인은 자격 증명의 유효성을 검사하기 직전에 호출됩니다.
인증이 발생하려면 이 속성에 대한 대리자를 제공해야 합니다.
대리자에서는 context.Principal 속성에 할당되고 context.Success()를 호출할 사용자 세부 정보에서 인증 클레임 주체 생성을 처리하는 context.ValidationSucceeded()를 호출하거나 사용자로부터 인증 클레임 주체를 생성해야 합니다. 세부 정보를 찾아 context.Principal 속성에 할당하고 마지막으로 context.Success() 메서드를 호출합니다.
context.Success() 메서드를 호출하지 않고 context.Principal 속성만 설정하면 Success() 메서드가 자동으로 호출됩니다.
인증이 성공하면 이 속성에 할당된 대리자가 호출됩니다. OnValidateCredentials 대리자가 할당된 경우 호출되지 않습니다.
응답에 클레임, 헤더 등을 추가하는 데 사용할 수 있습니다.
라이브러리 내에서 예상치 못한 예외가 발생하면 이 속성에 할당된 대리자가 호출됩니다.
이 속성에 할당된 대리자는 승인되지 않은 응답을 처리할 때 호출자에게 인증 확인이 다시 전송되기 전에 호출됩니다.
현재 수행 중인 작업을 알고 있고 사용자 정의 구현을 사용하려는 경우에만 이 방법을 사용하십시오. 문제의 인증 체계가 요청 흐름의 일부로 인증 상호 작용을 처리하는 경우 401 문제 문제를 처리하도록 대리자를 설정합니다. (응답 헤더를 추가하거나 로그인 페이지 또는 외부 로그인 위치의 401 결과를 302로 변경하는 등)
이 챌린지에 대한 기본 로직을 건너뛰도록 마지막에 context.Handled()를 호출하세요.
권한 부여가 실패하고 Forbidden 응답이 발생하는 경우 이 속성에 할당된 대리자가 호출됩니다.
현재 수행 중인 작업을 알고 있고 사용자 정의 구현을 사용하려는 경우에만 이 방법을 사용하십시오.
Forbid를 처리하도록 대리자를 설정합니다.
기본 논리를 건너뛰도록 마지막에 context.Handled()를 호출합니다.
ASP.NET Core를 사용하면 기본적으로 모든 요청에 대한 인증이 요청되지 않습니다. 따라서 요청과 함께 필요한 기본 인증 세부 정보를 전달하지 않을 때 BasicUserValidationService가 적중되지 않더라도 걱정하지 마세요. 이는 정상적인 행동입니다. ASP.NET Core는 [Authorize] 필터 특성으로 컨트롤러/메서드를 장식하거나 다른 방법을 통해 특별히 지시된 경우에만 인증을 요청합니다.
그러나 기본적으로 모든 요청에 대해 인증을 요청하려는 경우 사용 중인 항목에 따라 Startup 클래스의 ConfigureServices 메서드에 아래 옵션 줄을 추가할 수 있습니다.
// ASP.NET Core 3.0 onwardsservices.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();});// OR// ASP.NET Core 2.0 onwardsservices.AddMvc (옵션 => {options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));});
MVC를 사용하지 않지만 ASP.NET Core 3.0 이상에서 끝점을 사용하는 경우 아래와 같이 시작 클래스의 구성 메서드 아래 끝점 맵에 체인 메서드 .RequireAuthorization()
을 추가할 수 있습니다.
// ASP.NET Core 3.0 onwardsapp.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World!");}).RequireAuthorization(); / / 여기를 참고하세요!!!! });
ASP.NET Core는 이 라이브러리도 지원하는 여러 인증 체계 추가를 지원합니다. 매개변수로 구성표 이름을 사용하는 확장 방법을 사용해야 합니다. 나머지는 모두 동일합니다. 이는 다양한 방법으로 달성될 수 있습니다. 아래는 간단하고 대략적인 예입니다.
구성표 이름 매개변수는 원하는 문자열이 될 수 있습니다.
public void ConfigureServices(IServiceCollection 서비스){services.AddTransient<IUserRepository, InMemoryUserRepository>();services.AddAuthentication("Scheme1").AddBasic<BasicUserValidationService>("Scheme1", options => { options.Realm = "내 앱"; }).AddBasic<BasicUserValidationService_2>("Scheme2", 옵션 => { options.Realm = "내 앱"; }).AddBasic("Scheme3", 옵션 => { options.Realm = "내 앱"; options.Events = 새로운 BasicEvents{OnValidateCredentials = async (컨텍스트) =>{var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();var user = wait userRepository.GetUserByUsername(context.Username);var isValid = user ! = null && user.Password == context.Password;if (isValid){context.Response.Headers.Add("ValidationCustomHeader", "OnValidateCredentials에서");var Claims = new[]{new Claim("CustomClaimType", "사용자 정의 클레임 값 - OnValidateCredentials에서")};context.ValidationSucceeded (청구); // 클레임은 선택 사항입니다.}else{context.ValidationFailed();}}}});services.AddControllers();services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder("Scheme1", "Scheme2", " Scheme3").RequireAuthenticatedUser().Build();});}
버전 | 메모 |
---|---|
8.0.0 |
|
7.0.0 |
|
6.0.1 |
|
5.1.0 |
|
5.0.0 |
|
3.1.1 |
|
3.1.0 |
|
2.2.0 |
|
RFC 7617: HTTP 기본 기술 사양
ASP.NET Core 보안 문서
ASPNET/보안
MIT 라이센스