ASP.NET Core에서 SMS 사용한 2 단계 인증Two-factor authentication with SMS in ASP.NET Core

하 여 Rick Anderson스위스 개발자By Rick Anderson and Swiss-Devs

경고

두 단계 인증 (2FA) authenticator 앱의 경우는 시간 기반 일회용 암호 알고리즘 (TOTP)를 사용 하 여 권장 접근법 2FA 위한 업계 됩니다.Two factor authentication (2FA) authenticator apps, using a Time-based One-time Password Algorithm (TOTP), are the industry recommended approach for 2FA. 2FA TOTP를 사용 하 여는 SMS 2FA 하는 것이 좋습니다.2FA using TOTP is preferred to SMS 2FA. 자세한 내용은 ASP.NET Core에서 TOTP authenticator 앱에 대 한 QR 코드를 사용 하도록 설정 생성 ASP.NET Core 2.0 이상.For more information, see Enable QR Code generation for TOTP authenticator apps in ASP.NET Core for ASP.NET Core 2.0 and later.

이 자습서에는 SMS를 사용 하 여 2 단계 인증 (2FA)을 설정 하는 방법을 보여 줍니다.This tutorial shows how to set up two-factor authentication (2FA) using SMS. 에 대 한 지침이 제공 됩니다 twilio 하 고 ASPSMS, 하지만 다른 SMS 공급자를 사용할 수 있습니다.Instructions are given for twilio and ASPSMS, but you can use any other SMS provider. 완료 하는 것이 좋습니다 계정 확인 및 암호 복구 이 자습서를 시작 하기 전에 합니다.We recommend you complete Account Confirmation and Password Recovery before starting this tutorial.

샘플 코드 보기 또는 다운로드View or download sample code. 다운로드 하는 방법을합니다.How to download.

새 ASP.NET Core 프로젝트 만들기Create a new ASP.NET Core project

라는 새 ASP.NET Core 웹 앱 만들기 Web2FA 개별 사용자 계정을 사용 합니다.Create a new ASP.NET Core web app named Web2FA with individual user accounts. 지침에 따라 ASP.NET Core에서 HTTPS 적용 를 설정 하 고 HTTPS가 필요 합니다.Follow the instructions in ASP.NET Core에서 HTTPS 적용 to set up and require HTTPS.

SMS 계정 만들기Create an SMS account

예를 들어 SMS 계정을 만들 twilio 하거나 ASPSMS합니다.Create an SMS account, for example, from twilio or ASPSMS. 인증 자격 증명을 기록 (twilio: accountSid 및 authToken, ASPSMS에 대 한 합니다. 사용자 키 및 암호)입니다.Record the authentication credentials (for twilio: accountSid and authToken, for ASPSMS: Userkey and Password).

SMS 공급자 자격 증명 확인Figuring out SMS Provider credentials

Twilio:Twilio:

Twilio 계정의 대시보드 탭에서 복사 합니다 계정 SID 하 고 인증 토큰합니다.From the Dashboard tab of your Twilio account, copy the Account SID and Auth token.

ASPSMS:ASPSMS:

계정 설정을에서 이동 Userkey 와 함께 복사 및 사용자 암호합니다.From your account settings, navigate to Userkey and copy it together with your Password.

키 암호 관리자 도구를 사용 하 여 이러한 값을 나중에 저장 됩니다 것 SMSAccountIdentificationSMSAccountPassword입니다.We will later store these values in with the secret-manager tool within the keys SMSAccountIdentification and SMSAccountPassword.

SenderID 지정 / 송신자Specifying SenderID / Originator

Twilio: 숫자 탭에서 복사 하면 Twilio 전화번호합니다.Twilio: From the Numbers tab, copy your Twilio phone number.

ASPSMS: 보낸 사람 잠금 해제 메뉴 내에서 하나 이상의 보낸 사람을 잠금 해제 하거나 (모든 네트워크에서 지원 되지 않음)는 영숫자 보낸 사람을 선택 합니다.ASPSMS: Within the Unlock Originators Menu, unlock one or more Originators or choose an alphanumeric Originator (Not supported by all networks).

저장 하겠습니다. 나중에 키에 암호 관리자 도구를 사용 하 여이 값 SMSAccountFrom합니다.We will later store this value with the secret-manager tool within the key SMSAccountFrom.

SMS 서비스에 대 한 자격 증명을 제공 합니다.Provide credentials for the SMS service

사용 된 옵션 패턴 사용자 계정 및 키 설정에 액세스 해야 합니다.We'll use the Options pattern to access the user account and key settings.

  • 가져올 보안 SMS 키 클래스를 만듭니다.Create a class to fetch the secure SMS key. 이 샘플에서는 합니다 SMSoptions 클래스에 생성 됩니다 합니다 Services/SMSoptions.cs 파일.For this sample, the SMSoptions class is created in the Services/SMSoptions.cs file.
namespace Web2FA.Services
{
    public class SMSoptions
    {
        public string SMSAccountIdentification { get; set; }
        public string SMSAccountPassword { get; set; }
        public string SMSAccountFrom { get; set; }
    }
}

설정 합니다 SMSAccountIdentification, SMSAccountPassword 하 고 SMSAccountFrom 사용 하 여를 암호 관리자 도구.Set the SMSAccountIdentification, SMSAccountPassword and SMSAccountFrom with the secret-manager tool. 예를 들어 다음과 같습니다.For example:

C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
  • SMS 공급자에 대 한 NuGet 패키지를 추가 합니다.Add the NuGet package for the SMS provider. 관리자 콘솔 (PMC (패키지)를 실행 합니다.From the Package Manager Console (PMC) run:

Twilio:Twilio:

Install-Package Twilio

ASPSMS:ASPSMS:

Install-Package ASPSMS

  • 코드를 추가 합니다 Services/MessageServices.cs SMS를 사용 하도록 설정 하려면 파일입니다.Add code in the Services/MessageServices.cs file to enable SMS. Twilio 또는 ASPSMS 섹션 중 하나를 사용 합니다.Use either the Twilio or the ASPSMS section:

Twilio: [!code-csharp]Twilio: [!code-csharp]

ASPSMS: [!code-csharp]ASPSMS: [!code-csharp]

사용 하는 시작 구성 SMSoptionsConfigure startup to use SMSoptions

추가 SMSoptions 의 서비스 컨테이너에 ConfigureServices 에서 메서드는 Startup.cs:Add SMSoptions to the service container in the ConfigureServices method in the Startup.cs:

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
    services.Configure<SMSoptions>(Configuration);
}

2 단계 인증을 사용 하도록 설정Enable two-factor authentication

엽니다는 Views/Manage/Index.cshtml Razor 뷰 파일과 주석 문자 (따라서 없는 태그는 주석) 제거 합니다.Open the Views/Manage/Index.cshtml Razor view file and remove the comment characters (so no markup is commented out).

2 단계 인증으로 로그인Log in with two-factor authentication

  • 앱을 실행 하 고 새 사용자 등록Run the app and register a new user

Microsoft Edge에서 열린 웹 응용 프로그램 등록 보기

  • 활성화 하는 사용자 이름을 탭 합니다 Index 관리 컨트롤러의 동작 메서드.Tap on your user name, which activates the Index action method in Manage controller. 전화 번호를 누릅니다 추가 링크 합니다.Then tap the phone number Add link.

보기 관리-"추가" 링크를 탭 합니다.

  • 확인 코드를 받고 탭는 전화 번호를 추가할 확인 코드 보내기합니다.Add a phone number that will receive the verification code, and tap Send verification code.

전화 번호 페이지 추가

  • 확인 코드로 문자 메시지를 받습니다.You will get a text message with the verification code. 입력 하 고 탭 제출Enter it and tap Submit

전화 번호 페이지 확인

텍스트 메시지를 얻지 못한 경우 twilio 로그 페이지를 참조 하세요.If you don't get a text message, see twilio log page.

  • 관리 보기를 보여 줍니다 전화 번호를 추가 했습니다.The Manage view shows your phone number was added successfully.

관리 보기-전화 번호가 추가 했습니다.

  • 사용 2 단계 인증을 사용 하도록 설정 합니다.Tap Enable to enable two-factor authentication.

보기 관리-2 단계 인증을 사용 하도록 설정

2 단계 인증 테스트Test two-factor authentication

  • 로그 오프 합니다.Log off.

  • 로그인Log in.

  • 사용자 계정 인증의 두번째 단계를 제공 해야 하므로 이중 인증이 있었습니다.The user account has enabled two-factor authentication, so you have to provide the second factor of authentication . 이 자습서에서는 전화 확인 하도록 설정한 합니다.In this tutorial you have enabled phone verification. 기본 제공된 템플릿의 허용 하는 두 번째 단계로 전자 메일을 설정할 수 있습니다.The built in templates also allow you to set up email as the second factor. QR 코드와 같은 인증에 대 한 추가 두 번째 요소를 설정할 수 있습니다.You can set up additional second factors for authentication such as QR codes. 제출합니다.Tap Submit.

뷰 확인 코드 보내기

  • SMS 메시지에는 코드를 입력 합니다.Enter the code you get in the SMS message.

  • 클릭 하 여 이 브라우저 기억 확인란 있습니다 2FA를 사용 하 여 동일한 장치 및 브라우저를 사용 하는 경우 로그온 할 필요가에서 제외 됩니다.Clicking on the Remember this browser check box will exempt you from needing to use 2FA to log on when using the same device and browser. 2FA를 사용 하도록 설정 하 고 클릭 이 브라우저 기억 하면 강력한 2FA 보호를 사용 하 여 악의적인 사용자와 장치에 액세스할 수 없는 계정에 액세스 하려고 합니다.Enabling 2FA and clicking on Remember this browser will provide you with strong 2FA protection from malicious users trying to access your account, as long as they don't have access to your device. 정기적으로 사용 하는 모든 개인 장치에서이 수행할 수 있습니다.You can do this on any private device you regularly use. 설정 하 여 이 브라우저 기억, 정기적으로 사용 하지 않는 장치에서 추가 보안 2FA 얻게 및 고유한 장치의 2FA를 통해 이동 하지 않아도에서 편리 하 게 표시 합니다.By setting Remember this browser, you get the added security of 2FA from devices you don't regularly use, and you get the convenience on not having to go through 2FA on your own devices.

보기를 확인 합니다.

무차별 대입 공격 으로부터 보호 하기 위한 계정 잠금Account lockout for protecting against brute force attacks

2FA를 사용 하 여 계정 잠금 것이 좋습니다.Account lockout is recommended with 2FA. 사용자가 로컬 계정 또는 소셜 계정을 통해 로그인 되 면 각 실패 한 시도 2FA에 저장 됩니다.Once a user signs in through a local account or social account, each failed attempt at 2FA is stored. 사용자가 잠겨 실패 한 최대 액세스 시도 횟수에 도달 하는 경우 (기본값: 5 분 잠금 5에 대 한 액세스 시도가 실패 한 후).If the maximum failed access attempts is reached, the user is locked out (default: 5 minute lockout after 5 failed access attempts). 실패 한 액세스 시도 횟수를 다시 설정 하 고 시계를 다시 설정 하는 성공적으로 인증 합니다.A successful authentication resets the failed access attempts count and resets the clock. 최대 액세스 시도 실패 하 고 사용 하 여 잠금 시간을 설정할 수 있습니다 MaxFailedAccessAttempts 하 고 DefaultLockoutTimeSpan합니다.The maximum failed access attempts and lockout time can be set with MaxFailedAccessAttempts and DefaultLockoutTimeSpan. 다음 10 분 동안 10에 대 한 액세스 시도가 실패 한 후 계정 잠금을 구성 합니다.The following configures account lockout for 10 minutes after 10 failed access attempts:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc();

    services.Configure<IdentityOptions>(options =>
    {
        options.Lockout.MaxFailedAccessAttempts = 10;
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
    });

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddTransient<ISmsSender, AuthMessageSender>();
    services.Configure<SMSoptions>(Configuration);
}

확인 PasswordSignInAsync 설정 lockoutOnFailure 하려면 true:Confirm that PasswordSignInAsync sets lockoutOnFailure to true:

var result = await _signInManager.PasswordSignInAsync(
                 Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);