ASP.NET Core에서 Facebook, Google 및 외부 공급자 인증

작성자: Valeriy NovytskyyRick Anderson

이 자습서에서는 사용자가 외부 인증 공급 기업의 자격 증명으로 OAuth 2.0을 사용하여 로그인할 수 있도록 ASP.NET Core 앱을 빌드하는 방법을 보여 줍니다.

Facebook, Twitter, GoogleMicrosoft 공급자는 다음 섹션에서 다루고 이 문서에서 만든 시작 프로젝트를 사용합니다. 다른 공급자는 AspNet.Security.OAuth.ProvidersAspNet.Security.OpenId.Providers와 같은 타사 패키지에서 사용할 수 있습니다.

사용자가 기존 자격 증명으로 로그인할 수 있도록 설정:

  • 사용자에게 편리합니다.
  • 로그인 프로세스를 관리하는 많은 복잡한 과정을 타사로 이전합니다.

새 ASP.NET Core 프로젝트 만들기

  • ASP.NET Core 웹앱 템플릿을 선택합니다. 확인을 선택합니다.
  • 인증 유형 입력에서 개별 계정을선택합니다.

마이그레이션 적용

  • 앱을 실행하고 레지스터 링크를 선택합니다.
  • 새 계정의 메일과 암호를 입력한 다음 등록을 선택합니다.
  • 지침에 따라 마이그레이션을 적용합니다.

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

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

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

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

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

SecretManager를 사용하여 로그인 공급자에 의해 할당된 토큰 저장

소셜 로그인 공급자는 등록 프로세스 중에 애플리케이션 ID애플리케이션 암호 토큰을 할당합니다. 정확한 토큰 이름은 공급자에 따라 달라집니다. 이러한 토큰은 앱이 API에 액세스하는 데 사용하는 자격 증명을 나타냅니다. 토큰은 Secret Manager의 도움으로 앱 구성에 연결할 수 있는 “사용자 비밀”을 구성합니다. 사용자 비밀은 appsettings.json 같은 구성 파일에 토큰을 저장하는 보다 안전한 대안입니다.

Important

Secret Manager는 개발 목적으로만 사용됩니다. Azure Key Vault 구성 제공자로 Azure 테스트 및 프로덕션 암호를 저장하고 보호할 수 있습니다.

ASP.NET Core에서 개발 중인 앱 암호의 안전한 스토리지 항목의 단계에 따라 아래의 각 로그인 공급자에 의해 할당된 토큰을 저장합니다.

애플리케이션에 필요한 로그인 공급자 설정

다음 항목을 사용하여 해당 공급자를 사용하도록 애플리케이션을 구성합니다.

여러 인증 공급자

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

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApplication16.Data;

var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;

var connectionString = config.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options =>
                                 options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication()
   .AddGoogle(options =>
   {
       IConfigurationSection googleAuthNSection =
       config.GetSection("Authentication:Google");
       options.ClientId = googleAuthNSection["ClientId"];
       options.ClientSecret = googleAuthNSection["ClientSecret"];
   })
   .AddFacebook(options =>
   {
       IConfigurationSection FBAuthNSection =
       config.GetSection("Authentication:FB");
       options.ClientId = FBAuthNSection["ClientId"];
       options.ClientSecret = FBAuthNSection["ClientSecret"];
   })
   .AddMicrosoftAccount(microsoftOptions =>
   {
       microsoftOptions.ClientId = config["Authentication:Microsoft:ClientId"];
       microsoftOptions.ClientSecret = config["Authentication:Microsoft:ClientSecret"];
   })
   .AddTwitter(twitterOptions =>
   {
       twitterOptions.ConsumerKey = config["Authentication:Twitter:ConsumerAPIKey"];
       twitterOptions.ConsumerSecret = config["Authentication:Twitter:ConsumerSecret"];
       twitterOptions.RetrieveUserDetails = true;
   });

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

필요에 따라 암호 설정

외부 로그인 공급자를 등록하는 경우 앱에 암호를 등록하지 않은 상태입니다. 그러면 사이트에 암호를 만들고 기억하지 않아도 되지만 외부 로그인 공급자에 따라 다르게 적용해야 합니다. 외부 로그인 공급자를 사용할 수 없는 경우 웹 사이트에 로그인할 수 없습니다.

외부 공급자로 로그인하는 프로세스 중에 설정한 전자 메일을 사용하여 암호를 만들고 로그인하려면:

  • 오른쪽 위 모서리에 있는 Hello <이메일 별칭> 링크를 선택하여 관리 보기로 이동합니다.

Web application Manage view

  • 만들기를 선택합니다.

Set your password page

  • 올바른 암호를 설정하고 사용자의 전자 메일을 사용하여 로그인하는 데 사용할 수 있습니다.

추가 정보