ASP.NET Core를 사용하여 Microsoft 계정 외부 로그인 설정

작성자: Valeriy NovytskyyRick Anderson

이 샘플에서는 사용자가 이전 페이지에서 만든 ASP.NET Core 6.0 프로젝트를 사용하여 회사, 학교 또는 개인 Microsoft 계정으로 로그인할 수 있도록 하는 방법을 보여 줍니다.

Microsoft 개발자 포털에서 앱 만들기

Microsoft 계정이 없는 경우 만들기를 선택합니다. 로그인하면 앱 등록 페이지로 리디렉션됩니다.

  • 새 등록 선택
  • 이름을 입력합니다.
  • 지원되는 계정 유형에 대한 옵션을 선택합니다.
    • MicrosoftAccount 패키지는 기본적으로 "모든 조직 디렉터리의 계정" 또는 "조직 디렉터리 및 Microsoft 계정의 계정" 옵션을 사용하여 만든 앱 등록을 지원합니다.
    • 다른 옵션을 사용하려면 Microsoft 계정 인증을 만든 후 앱 등록의 엔드포인트 페이지에 표시되는 URL에 초기화하는 데 사용되는 MicrosoftAccountOptionsAuthorizationEndpointTokenEndpoint 멤버를 설정합니다(개요 페이지의 엔드포인트를 클릭하여 사용 가능).
  • URI 리디렉션에서 /signin-microsoft가 추가된 개발 URL을 입력합니다. 예: https://localhost:5001/signin-microsoft. 이 샘플의 뒷부분에서 구성된 Microsoft 인증 체계는 OAuth 흐름을 구현하는 /signin-microsoft 경로에서 요청을 자동으로 처리합니다.
  • 등록을 선택합니다.

클라이언트 암호 만들기

  • 왼쪽 창에서 인증서 및 비밀을 선택합니다.
  • 클라이언트 암호에서 새 클라이언트 암호를 선택합니다.
    • 클라이언트 암호에 대한 설명을 추가합니다.
    • 추가 단추를 선택합니다.
  • 클라이언트 암호에서 클라이언트 암호의 값을 복사합니다.

URI 세그먼트 /signin-microsoft는 Microsoft 인증 공급자의 기본 콜백으로 설정됩니다. 클래스의 상속된 속성을 통해 Microsoft 인증 미들웨어를 구성하는 동안 기본 콜백 URI를 RemoteAuthenticationOptions.CallbackPathMicrosoftAccountOptions 변경할 수 있습니다.

Microsoft 클라이언트 ID 및 암호 저장

비밀 관리자를 사용하여 인증서 및 비밀 페이지에서 만든 앱 등록 및 클라이언트 암호개요 페이지에 있는 Microsoft 애플리케이션(클라이언트) ID와 같은 중요한 설정을 저장합니다. 이 샘플의 경우 다음 단계를 사용합니다.

  1. 비밀 스토리지 사용의 지침에 따라 비밀 스토리지에 대한 프로젝트를 초기화합니다.

  2. 비밀 키 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret이 포함된 로컬 비밀 저장소에 중요한 설정을 저장합니다.

    dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
    

: 구분 기호는 모든 플랫폼의 환경 변수 계층적 키에서 작동하지 않습니다. 이중 밑줄 __은 다음과 같습니다.

  • 모든 플랫폼에서 지원됩니다. 예를 들어 : 구분 기호는 Bash에서 지원되지 않지만 __은 지원됩니다.
  • 자동으로 :으로 대체

Microsoft 계정 인증 구성

인증 서비스를 Program에 추가합니다.

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;

services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = configuration["Authentication:Microsoft:ClientSecret"];
    });

오버로드는 AddAuthentication(IServiceCollection, String) 속성을 설정합니다 DefaultScheme . AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 오버로드를 통해 인증 옵션을 설정할 수 있으며, 이로서 다양한 용도를 위해 기본 인증 체계를 설정할 수 있습니다. 이전에 구성된 AuthenticationOptions 속성을 재정의하기 위한 AddAuthentication 후속 호출입니다.

AuthenticationBuilder 인증 처리기를 등록하는 확장 메서드는 인증 체계당 한 번만 호출할 수 있습니다. 구성표 속성, 구성표 이름 및 표시 이름을 구성할 수 있는 오버로드가 있습니다.

Microsoft 계정 인증에서 지원하는 구성 옵션에 대한 자세한 내용은 API 참조를 MicrosoftAccountOptions 참조하세요. 사용자에 대한 다른 정보를 요청하는 데 사용할 수 있습니다.

Microsoft 계정으로 로그인

  • 앱을 실행하고 로그인을 선택합니다. Microsoft에 로그인할 수 있는 옵션이 나타납니다.
  • Microsoft에 로그인하려면 선택합니다. 인증을 위해 Microsoft로 리디렉션됩니다. Microsoft 계정을 사용하여 로그인한 후에 앱에서 사용자의 정보에 액세스하도록 허용하라는 메시지가 표시됩니다.
  • 를 선택합니다. 전자 메일을 설정할 수 있는 웹 사이트로 다시 리디렉션됩니다.

이제 Microsoft 자격 증명을 사용하여 로그인되었습니다.

여러 인증 공급자

앱에서 여러 공급자가 필요한 경우, AddAuthentication 아래에서 공급자 확장 메서드를 연결합니다.

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

프록시 또는 부하 분산 장치를 사용하여 요청 정보 전달

앱이 프록시 서버 또는 부하 분산 장치 뒤에 배포되는 경우 원래 요청 정보의 일부가 요청 헤더로 앱에 전달될 수 있습니다. 이 정보에는 일반적으로 보안 요청 체계(https), 호스트 및 클라이언트 IP 주소가 포함됩니다. 앱은 원래 요청 정보를 검색 및 사용하기 위해 이 요청 헤더를 자동으로 읽지 않습니다.

이 체계는 외부 공급자의 인증 흐름에 영향을 주는 링크 생성에 사용됩니다. 보안 체계(https)가 손실되면 앱이 잘못되고 안전하지 않은 리디렉션 URL을 생성합니다.

전달된 헤더 미들웨어를 사용하여 요청 처리를 위한 원본 요청 정보를 앱에 제공합니다.

자세한 내용은 프록시 서버 및 부하 분산 장치를 사용하도록 ASP.NET Core 구성을 참조하세요.

문제 해결

  • Microsoft 계정 공급자가 로그인 오류 페이지로 리디렉션되는 경우 Uri에서 #(해시태그) 바로 다음에 나오는 오류 제목 및 설명 쿼리 문자열 매개 변수를 확인합니다.

    오류 메시지가 Microsoft 인증 문제를 나타내는 것처럼 보이지만 가장 일반적인 원인은 플랫폼에 지정된 리디렉션 URI와 일치하지 않는 애플리케이션 Uri입니다.

  • ConfigureServices에서 services.AddIdentity를 호출하여 Identity를 구성하지 않은 경우 인증을 시도하면 ArgumentException: ‘SignInScheme’ 옵션을 제공해야 함이라고 표시됩니다. 이 샘플에서 사용되는 프로젝트 템플릿은 이 작업을 수행하도록 보장합니다.

  • 초기 마이그레이션을 적용하여 사이트 데이터베이스를 만들지 않은 경우 요청을 처리하는 동안 데이터베이스 작업이 실패했습니다 오류가 표시됩니다. 마이그레이션 적용을 탭하여 데이터베이스를 만들고 새로 고쳐 오류를 무시하고 계속합니다.

다음 단계

  • 이 문서에서는 Microsoft로 인증할 수 있는 방법을 살펴보았습니다. 비슷한 방식을 따라 이전 페이지에 나열된 다른 공급자로 인증할 수 있습니다.
  • Azure 웹앱에 웹 사이트를 게시한 후에는 Microsoft 개발자 포털에서 새 클라이언트 암호를 만듭니다.
  • Azure Portal에서 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret을 애플리케이션 설정으로 설정합니다. 구성 시스템은 환경 변수에서 키를 읽도록 설정됩니다.

이 샘플에서는 사용자가 이전 페이지에서 만든 ASP.NET Core 3.0 프로젝트를 사용하여 회사, 학교 또는 개인 Microsoft 계정으로 로그인할 수 있도록 하는 방법을 보여 줍니다.

Microsoft 개발자 포털에서 앱 만들기

Microsoft 계정이 없는 경우 만들기를 선택합니다. 로그인하면 앱 등록 페이지로 리디렉션됩니다.

  • 새 등록 선택
  • 이름을 입력합니다.
  • 지원되는 계정 유형에 대한 옵션을 선택합니다.
    • MicrosoftAccount 패키지는 기본적으로 "모든 조직 디렉터리의 계정" 또는 "조직 디렉터리 및 Microsoft 계정의 계정" 옵션을 사용하여 만든 앱 등록을 지원합니다.
    • 다른 옵션을 사용하려면 Microsoft 계정 인증을 만든 후 앱 등록의 엔드포인트 페이지에 표시되는 URL에 초기화하는 데 사용되는 MicrosoftAccountOptionsAuthorizationEndpointTokenEndpoint 멤버를 설정합니다(개요 페이지의 엔드포인트를 클릭하여 사용 가능).
  • URI 리디렉션에서 /signin-microsoft가 추가된 개발 URL을 입력합니다. 예: https://localhost:5001/signin-microsoft. 이 샘플의 뒷부분에서 구성된 Microsoft 인증 체계는 OAuth 흐름을 구현하는 /signin-microsoft 경로에서 요청을 자동으로 처리합니다.
  • 등록을 선택합니다.

클라이언트 암호 만들기

  • 왼쪽 창에서 인증서 및 비밀을 선택합니다.
  • 클라이언트 암호에서 새 클라이언트 암호를 선택합니다.
    • 클라이언트 암호에 대한 설명을 추가합니다.
    • 추가 단추를 선택합니다.
  • 클라이언트 암호에서 클라이언트 암호의 값을 복사합니다.

URI 세그먼트 /signin-microsoft는 Microsoft 인증 공급자의 기본 콜백으로 설정됩니다. 클래스의 상속된 속성을 통해 Microsoft 인증 미들웨어를 구성하는 동안 기본 콜백 URI를 RemoteAuthenticationOptions.CallbackPathMicrosoftAccountOptions 변경할 수 있습니다.

Microsoft 클라이언트 ID 및 암호 저장

비밀 관리자를 사용하여 인증서 및 비밀 페이지에서 만든 앱 등록 및 클라이언트 암호개요 페이지에 있는 Microsoft 애플리케이션(클라이언트) ID와 같은 중요한 설정을 저장합니다. 이 샘플의 경우 다음 단계를 사용합니다.

  1. 비밀 스토리지 사용의 지침에 따라 비밀 스토리지에 대한 프로젝트를 초기화합니다.

  2. 비밀 키 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret이 포함된 로컬 비밀 저장소에 중요한 설정을 저장합니다.

    dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Microsoft:ClientSecret" "<client-secret>"
    

: 구분 기호는 모든 플랫폼의 환경 변수 계층적 키에서 작동하지 않습니다. 이중 밑줄 __은 다음과 같습니다.

  • 모든 플랫폼에서 지원됩니다. 예를 들어 : 구분 기호는 Bash에서 지원되지 않지만 __은 지원됩니다.
  • 자동으로 :으로 대체

Microsoft 계정 인증 구성

Microsoft 계정 서비스를 Startup.ConfigureServices에 추가합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
    });
}

오버로드는 AddAuthentication(IServiceCollection, String) 속성을 설정합니다 DefaultScheme . AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) 오버로드를 통해 인증 옵션을 설정할 수 있으며, 이로서 다양한 용도를 위해 기본 인증 체계를 설정할 수 있습니다. 이전에 구성된 AuthenticationOptions 속성을 재정의하기 위한 AddAuthentication 후속 호출입니다.

AuthenticationBuilder 인증 처리기를 등록하는 확장 메서드는 인증 체계당 한 번만 호출할 수 있습니다. 구성표 속성, 구성표 이름 및 표시 이름을 구성할 수 있는 오버로드가 있습니다.

Microsoft 계정 인증에서 지원하는 구성 옵션에 대한 자세한 내용은 API 참조를 MicrosoftAccountOptions 참조하세요. 사용자에 대한 다른 정보를 요청하는 데 사용할 수 있습니다.

Microsoft 계정으로 로그인

앱을 실행하고 로그인을 선택합니다. Microsoft에 로그인할 수 있는 옵션이 나타납니다. Microsoft를 클릭하면 인증을 위해 Microsoft로 리디렉션됩니다. Microsoft 계정을 사용하여 로그인한 후에 앱에서 사용자의 정보에 액세스하도록 허용하라는 메시지가 표시됩니다.

를 탭하면 이메일을 설정할 수 있는 웹 사이트로 다시 리디렉션됩니다.

이제 Microsoft 자격 증명을 사용하여 로그인되었습니다.

여러 인증 공급자

앱에서 여러 공급자가 필요한 경우, AddAuthentication 아래에서 공급자 확장 메서드를 연결합니다.

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

프록시 또는 부하 분산 장치를 사용하여 요청 정보 전달

앱이 프록시 서버 또는 부하 분산 장치 뒤에 배포되는 경우 원래 요청 정보의 일부가 요청 헤더로 앱에 전달될 수 있습니다. 이 정보에는 일반적으로 보안 요청 체계(https), 호스트 및 클라이언트 IP 주소가 포함됩니다. 앱은 원래 요청 정보를 검색 및 사용하기 위해 이 요청 헤더를 자동으로 읽지 않습니다.

이 체계는 외부 공급자의 인증 흐름에 영향을 주는 링크 생성에 사용됩니다. 보안 체계(https)가 손실되면 앱이 잘못되고 안전하지 않은 리디렉션 URL을 생성합니다.

전달된 헤더 미들웨어를 사용하여 요청 처리를 위한 원본 요청 정보를 앱에 제공합니다.

자세한 내용은 프록시 서버 및 부하 분산 장치를 사용하도록 ASP.NET Core 구성을 참조하세요.

문제 해결

  • Microsoft 계정 공급자가 로그인 오류 페이지로 리디렉션되는 경우 Uri에서 #(해시태그) 바로 다음에 나오는 오류 제목 및 설명 쿼리 문자열 매개 변수를 확인합니다.

    오류 메시지가 Microsoft 인증 문제를 나타내는 것처럼 보이지만 가장 일반적인 원인은 플랫폼에 지정된 리디렉션 URI와 일치하지 않는 애플리케이션 Uri입니다.

  • ConfigureServices에서 services.AddIdentity를 호출하여 Identity를 구성하지 않은 경우 인증을 시도하면 ArgumentException: ‘SignInScheme’ 옵션을 제공해야 함이라고 표시됩니다. 이 샘플에서 사용되는 프로젝트 템플릿은 이 작업을 수행하도록 보장합니다.

  • 초기 마이그레이션을 적용하여 사이트 데이터베이스를 만들지 않은 경우 요청을 처리하는 동안 데이터베이스 작업이 실패했습니다 오류가 표시됩니다. 마이그레이션 적용을 탭하여 데이터베이스를 만들고 새로 고쳐 오류를 무시하고 계속합니다.

다음 단계

  • 이 문서에서는 Microsoft로 인증할 수 있는 방법을 살펴보았습니다. 비슷한 방식을 따라 이전 페이지에 나열된 다른 공급자로 인증할 수 있습니다.
  • Azure 웹앱에 웹 사이트를 게시한 후에는 Microsoft 개발자 포털에서 새 클라이언트 암호를 만듭니다.
  • Azure Portal에서 Authentication:Microsoft:ClientIdAuthentication:Microsoft:ClientSecret을 애플리케이션 설정으로 설정합니다. 구성 시스템은 환경 변수에서 키를 읽도록 설정됩니다.