SMS와 2 단계 인증Two-factor authentication with SMS

Rick Anderson스위스 빌드하도록By Rick Anderson and Swiss-Devs

이 자습서는 ASP.NET Core에 적용 됩니다. 1.x만 합니다.This tutorial applies to ASP.NET Core 1.x only. 참조 ASP.NET Core에서 인증자 앱에 대 한 QR 코드를 사용 하도록 설정 생성 이상 ASP.NET 코어 2.0에 대 한 합니다.See Enabling QR Code generation for 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. 에 대 한 지침이 제공 됩니다 twilioASPSMS, 하지만 다른 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 the completed sample. 다운로드 하는 방법합니다.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 응용 프로그램에서 SSL 적용 를 설정 하 고 SSL이 필요 합니다.Follow the instructions in Enforcing SSL in an ASP.NET Core app to set up and require SSL.

SMS 계정 만들기Create an SMS account

예를 들어, SMS 계정을에서 만들고 twilio 또는 ASPSMS합니다.Create an SMS account, for example, from twilio or ASPSMS. 인증 자격 증명 기록 (twilio 용: accountSid 및 ASPSMS에 대 한 authToken: 사용자 키로 및 암호).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:
계정 설정을에서으로 이동 사용자 키로 와 함께 복사 및 프로그램 암호합니다.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, SMSAccountPasswordSMSAccountFrom암호 관리자 도구합니다.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:Twilio:

using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

namespace Web2FA.Services
{
    // This class is used by the application to send Email and SMS
    // when you turn on two-factor authentication in ASP.NET Identity.
    // For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
    public class AuthMessageSender : IEmailSender, ISmsSender
    {
        public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public SMSoptions Options { get; }  // set only via Secret Manager

        public Task SendEmailAsync(string email, string subject, string message)
        {
            // Plug in your email service here to send an email.
            return Task.FromResult(0);
        }

        public Task SendSmsAsync(string number, string message)
        {
            // Plug in your SMS service here to send a text message.
            // Your Account SID from twilio.com/console
            var accountSid = Options.SMSAccountIdentification;
            // Your Auth Token from twilio.com/console
            var authToken = Options.SMSAccountPassword;

            TwilioClient.Init(accountSid, authToken);

            return MessageResource.CreateAsync(
              to: new PhoneNumber(number),
              from: new PhoneNumber(Options.SMSAccountFrom),
              body: message);
        }
    }
}

ASPSMS:ASPSMS:

using Microsoft.Extensions.Options;
using System.Threading.Tasks;

namespace Web2FA.Services
{
    // This class is used by the application to send Email and SMS
    // when you turn on two-factor authentication in ASP.NET Identity.
    // For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
    public class AuthMessageSender : IEmailSender, ISmsSender
    {
        public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

        public SMSoptions Options { get; }  // set only via Secret Manager

        public Task SendEmailAsync(string email, string subject, string message)
        {
            // Plug in your email service here to send an email.
            return Task.FromResult(0);
        }

        public Task SendSmsAsync(string number, string message)
        {
            ASPSMS.SMS SMSSender = new ASPSMS.SMS();

            SMSSender.Userkey = Options.SMSAccountIdentification;
            SMSSender.Password = Options.SMSAccountPassword;
            SMSSender.Originator = Options.SMSAccountFrom;

            SMSSender.AddRecipient(number);
            SMSSender.MessageData = message;

            SMSSender.SendTextSMS();

            return Task.FromResult(0);
        }
    }
}

사용 하는 시작 구성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 commnted 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 단계 인증 테스트Test two-factor authentication

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

  • 로그인.Log in.

  • 2 단계 인증을 제공 해야 하므로 사용자 계정 2 단계 인증이 있었습니다.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 사용 하는 것이 좋습니다.We recommend you use account lockout with 2FA. 사용자가 로컬 계정 또는 소셜 계정) (통해 로그인 하 고 2FA에서 연결 시도가 실패할된 때마다 저장 됩니다 (기본값은 5)는 최대 시도 횟수에 도달 하면 사용자가 잠길 5 분 (잠금 시간 초과 설정할 수 있습니다 DefaultAccountLockoutTimeSpan).Once a user logs in (through a local account or social account), each failed attempt at 2FA is stored, and if the maximum attempts (default is 5) is reached, the user is locked out for five minutes (you can set the lock out time with DefaultAccountLockoutTimeSpan). 다음에서는 10 번 실패 후 10 분 동안 잠길 수 계정을 구성 합니다.The following configures Account to be locked out for 10 minutes after 10 failed 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.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
        options.Lockout.MaxFailedAccessAttempts = 10;
    });

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