원격 인증

System.Web 어댑터의 원격 인증 기능을 사용하면 ASP.NET Core 앱이 ASP.NET 앱으로 지연하여 사용자의 ID를 확인할 수 있습니다(HTTP 요청 인증). 이 기능을 사용하도록 설정하면 엔드포인트에 대한 모든 요청에 대해 인증된 사용자를 나타내는 직렬화된 ClaimsPrincipal을 반환하는 ASP.NET 앱에 엔드포인트가 추가됩니다. 그런 다음 ASP.NET Core 앱은 ASP.NET 앱에서 해당 엔드포인트를 호출하고 ASP.NET Core 앱에서 받은 원래 요청에서 선택한 헤더 및 cookie를 전달하여 사용자 ID를 결정하는 사용자 지정 인증 처리기를 등록합니다.

구성

시작에 따라 이미 설정된 솔루션에서 원격 인증을 사용하도록 설정하는 데 필요한 몇 가지 작은 코드 변경만 있습니다.

먼저 원격 앱 설정 지침에 따라 ASP.NET Core 및 ASP.NET 앱을 연결합니다. 그런 다음 원격 앱 인증을 사용하도록 설정하기 위해 호출할 몇 가지 추가 확장 메서드가 있습니다.

ASP.NET 앱 구성

ASP.NET 앱은 인증 엔드포인트를 추가하도록 구성해야 합니다. 인증 엔드포인트를 추가하려면 확장 메서드를 AddAuthenticationServer 호출하여 인증 엔드포인트에 대한 요청을 감시하는 HTTP 모듈을 설정합니다. 원격 인증 시나리오는 일반적으로 프록시 지원을 추가하려고 하므로 인증 관련 리디렉션이 ASP.NET 앱이 아닌 ASP.NET Core 앱으로 올바르게 라우팅됩니다.

SystemWebAdapterConfiguration.AddSystemWebAdapters(this)
    .AddProxySupport(options => options.UseForwardedHeaders = true)
    .AddRemoteAppServer(options =>
    {
        options.ApiKey = ConfigurationManager.AppSettings["RemoteAppApiKey"];
    })
    .AddAuthenticationServer();

ASP.NET Core 앱 구성

다음으로, ASP.NET 앱에 대한 HTTP 요청을 수행하여 사용자를 인증하는 인증 처리기를 사용하도록 ASP.NET Core 앱을 구성해야 합니다. 이 작업은 System.Web 어댑터 서비스를 등록할 때 AddAuthenticationClient를 호출하여 진행됩니다.

builder.Services.AddSystemWebAdapters()
    .AddRemoteAppClient(options =>
    {
        options.RemoteAppUrl = new Uri(builder.Configuration
            ["ReverseProxy:Clusters:fallbackCluster:Destinations:fallbackApp:Address"]);
        options.ApiKey = builder.Configuration["RemoteAppApiKey"];
    })
    .AddAuthenticationClient(true);

AddAuthenticationClient 호출에 전달되는 부울은 원격 앱 인증이 기본 인증 체계인지 여부를 지정합니다. true를 전달하면 사용자가 모든 요청에 대해 원격 앱 인증을 통해 인증되는 반면, false를 전달하면 원격 앱 구성표가 특별히 요청된 경우에만 사용자가 원격 앱 인증으로 인증됩니다(예: 컨트롤러 또는 작업 방법에 [Authorize(AuthenticationSchemes = RemoteAppAuthenticationDefaults.AuthenticationScheme)] 포함). 이 매개 변수에 대해 false를 전달하면 원격 앱 인증이 필요한 엔드포인트에 대한 인증을 위해 원래 ASP.NET 앱에 HTTP 요청만 수행할 수 있다는 장점이 있지만 원격 앱 인증을 사용한다는 것을 나타내려는 경우 이러한 모든 엔드포인트에 주석을 추가해야 하는 단점이 있습니다.

필요한 부울 외에도 선택적 콜백을 AddAuthenticationClient에 전달하여 원격 인증 프로세스 동작의 다른 측면을 수정할 수 있습니다.

  • RequestHeadersToForward: 이 속성은 인증 API를 호출할 때 요청에서 전달해야 하는 헤더를 포함합니다. 기본적으로 전달되는 헤더는 AuthorizationCookie뿐입니다. 이 목록에 추가 헤더를 추가하여 추가 헤더를 전달할 수 있습니다. 또는 (헤더가 지정되지 않도록) 목록이 지워지면 모든 헤더가 전달됩니다.
  • ResponseHeadersToForward: 이 속성은 ID에 문제가 있는 시나리오에서 인증 요청으로부터 인증을 요청하는 원래 호출로 다시 전파되어야 하는 응답 헤더를 나열합니다. 기본적으로 Location, Set-Cookie, 그리고 WWW-Authenticate 헤더가 포함됩니다.
  • AuthenticationEndpointPath: 인증 요청을 수행해야 하는 ASP.NET 앱의 엔드포인트입니다. 기본값은 /systemweb-adapters/authenticate이며 ASP.NET 인증 엔드포인트 구성에 지정된 엔드포인트와 일치해야 합니다.

마지막으로, ASP.NET Core 앱이 이전에 인증 미들웨어를 포함하지 않은 경우(미들웨어를 라우팅한 후 인증 미들웨어 전에) 사용하도록 설정해야 합니다.

app.UseAuthentication();

디자인

  1. ASP.NET Core 앱에서 요청을 처리할 때 원격 앱 인증이 기본 구성표이거나 요청의 엔드포인트에 의해 지정된 경우 RemoteAuthenticationAuthHandler는 사용자를 인증하려고 시도합니다.
    1. 처리기는 ASP.NET 앱의 인증 엔드포인트에 대한 HTTP 요청을 수행합니다. 인증 관련 데이터를 전달하기 위해 현재 요청에서 이 새 헤더로 구성된 헤더를 복사합니다. 위에서 설명한 대로 기본 동작은 AuthorizeCookie 헤더를 복사하는 것입니다. API 키 헤더도 보안을 위해 추가됩니다.
  2. ASP.NET 앱은 인증 엔드포인트로 전송된 요청을 처리합니다. API 키가 일치하는 한 ASP.NET 앱은 현재 사용자의 ClaimsPrincipal 직렬화된 응답 본문을 반환하거나 HTTP 상태 코드(예: 401 또는 302)와 실패를 나타내는 응답 헤더를 반환합니다.
  3. ASP.NET Core 앱이 RemoteAuthenticationAuthHandler ASP.NET 앱에서 응답을 수신하는 경우:
    1. ClaimsPrincipal이 성공적으로 반환된 경우 인증 처리기는 이를 역직렬화하고 현재 사용자의 ID로 사용합니다.
    2. ClaimsPrincipal이 성공적으로 반환되지 않은 경우 처리기는 결과를 저장하고 인증에 문제가 있는 경우(예: 사용자가 보호된 리소스에 액세스하고 있기 때문에) 요청의 응답은 상태 코드와 인증 엔드포인트의 응답에서 선택한 응답 헤더로 업데이트됩니다. 이를 통해 최종 사용자에게 챌린지 응답(예: 로그인 페이지로 리디렉션)을 전파할 수 있습니다.
      1. ASP.NET 앱의 인증 엔드포인트의 결과에는 엔드포인트와 관련된 데이터가 포함될 수 있으므로 사용자는 사용에 앞서 모든 인증 결과에서 실행되는 ASP.NET Core 앱에 IRemoteAuthenticationResultProcessor 구현을 등록할 수 있습니다. 예를 들어 하나의 기본 제공 IRemoteAuthenticationResultProcessor는 인증 엔드포인트에서 반환된 Location 응답 헤더를 찾고 ASP.NET 앱이 아닌 ASP.NET Core 앱의 호스트로 다시 리디렉션되도록 하는 RedirectUrlProcessor입니다.

알려진 제한 사항

이 원격 인증 방법에는 다음과 같은 몇 가지 알려진 제한 사항이 있습니다.

  1. Windows 인증은 Windows ID에 대한 핸들에 따라 달라지므로 이 기능은 Windows 인증을 지원하지 않습니다. 향후 작업은 공유 Windows 인증의 작동 방식을 검색하도록 계획하고 있습니다. 자세한 내용은 dotnet/systemweb-adapters#246을 참조하세요.
  2. 이 기능을 사용하면 ASP.NET Core 앱이 ASP.NET 앱에서 인증된 ID를 사용할 수 있지만 사용자와 관련된 모든 작업(로그온, 로그오프 등)은 여전히 ASP.NET 앱을 통해 라우팅되어야 합니다.

대안

ASP.NET 앱의 인증이 Microsoft.OwinCookie 인증 미들웨어를 사용하여 수행되는 경우 ID를 공유하는 대체 솔루션은 cookie 인증을 공유할 수 있도록 ASP.NET 및 ASP.NET Core 앱을 구성합니다. 인증 cookie를 공유하면 다음을 수행할 수 있습니다.

  • 두 앱 모두 동일한 cookie에서 사용자 ID를 확인합니다.
  • 한 앱에서 로그인 또는 로그아웃하면 사용자가 다른 앱에서도 로그인하거나 로그아웃합니다.

로그인은 일반적으로 특정 데이터베이스에 따라 달라지므로 모든 인증 기능이 두 앱에서 모두 작동하는 것은 아닙니다.

  • 사용자는 ASP.NET 또는 ASP.NET Core 앱 중 데이터베이스가 작동하도록 설정되어 있는 하나만을 통해 로그인해야 합니다.
  • 두 앱 모두 사용자의 ID 및 클레임을 볼 수 있습니다.
  • 두 앱 모두 사용자를 로그아웃할 수 있습니다.

ASP.NET 및 ASP.NET Core 앱 간에 공유 인증cookie를 구성하는 방법에 대한 자세한 내용은 cookie설명서 공유에서 확인할 수 있습니다. System.Web 어댑터 GitHub 리포지토리의 다음 샘플에서는 두 앱이 사용자를 로그인 및 로그아웃할 수 있도록 하는 공유 cookie 구성을 사용하여 원격 앱 인증을 보여 줍니다.

다음 두 가지 모두 true인 경우 인증을 공유하는 것이 좋습니다.

  • ASP.NET 앱이 이미 Microsoft.Owincookie 인증을 사용하고 있습니다.
  • ASP.NET 앱 및 ASP.NET Core 앱을 업데이트하여 일치하는 데이터 보호 설정을 사용할 수 있습니다. 일치하는 공유 데이터 보호 설정에는 데이터 보호 키를 저장하기 위한 공유 파일 경로, Redis 캐시 또는 Azure Blob Storage가 포함되어 있습니다.

기타 시나리오의 경우 이 문서의 앞에서 설명한 원격 인증 접근 방식이 더 유연하며 더 적합할 수 있습니다.