계정 확인 및 ASP.NET Core에서 암호 복구Account confirmation and password recovery in ASP.NET Core

작성자: Rick AndersonJoe AudetteBy Rick Anderson and Joe Audette

이 자습서에서는 전자 메일 확인 및 암호 재설정을 사용 하 여 ASP.NET Core 앱을 빌드하는 방법을 보여 줍니다.This tutorial shows you how to build an ASP.NET Core app with email confirmation and password reset. 이 자습서는 되지 시작 항목입니다.This tutorial is not a beginning topic. 에 대해 잘 알고 있어야 합니다.You should be familiar with:

참조 이 PDF 파일 ASP.NET Core MVC 1.1 및 2.x 버전에 대 한 합니다.See this PDF file for the ASP.NET Core MVC 1.1 and 2.x versions.

전제 조건Prerequisites

다음 중 하나를 수행합니다.Install one of the following:

.NET Core CLI를 사용 하 여 새 ASP.NET Core 프로젝트 만들기Create a new ASP.NET Core project with the .NET Core CLI

dotnet new webapp --auth Individual -o WebPWrecover
cd WebPWrecover

참고

ASP.NET Core 2.1 이상 버전에서 webapprazor 인수의 별칭입니다.In ASP.NET Core 2.1 or later, webapp is an alias of the razor argument. dotnet new webapp <OPTIONS> 명령이 새 Razor Pages 앱을 만드는 대신 dotnet new 명령 도움말을 로드하는 경우 .NET Core 2.1 SDK를 설치합니다.If the dotnet new webapp <OPTIONS> command loads the dotnet new command help instead of creating a new Razor Pages app, install the .NET Core 2.1 SDK.

dotnet new razor --auth Individual -o WebPWrecover
cd WebPWrecover
  • --auth Individual 개별 사용자 계정 프로젝트 템플릿을 지정합니다.--auth Individual specifies the Individual User Accounts project template.
  • Windows에 추가 된 -uld 옵션입니다.On Windows, add the -uld option. SQLite 대신 LocalDB를 사용 하도록 지정 합니다.It specifies LocalDB should be used instead of SQLite.
  • 실행 new mvc --help 이 명령에 도움이 됩니다.Run new mvc --help to get help on this command.

또는 Visual Studio를 사용 하 여 새 ASP.NET Core 프로젝트를 만들 수 있습니다.Alternatively, you can create a new ASP.NET Core project with Visual Studio:

  • Visual Studio에서 만드는 새 웹 응용 프로그램 프로젝트입니다.In Visual Studio, create a new Web Application project.
  • 선택 ASP.NET Core 2.0합니다.Select ASP.NET Core 2.0. .NET core 다음 이미지에서 선택한 선택할 수 있지만 .NET Framework합니다..NET Core is selected in the following image, but you can select .NET Framework.
  • 선택 인증 변경 로 설정 하 고 개별 사용자 계정합니다.Select Change Authentication and set to Individual User Accounts.
  • 기본값을 유지 스토어 사용자 계정을 앱합니다.Keep the default Store user accounts in-app.

선택 하는 "개별 사용자 계정 radio"를 표시 하는 새 프로젝트 대화 상자

새 사용자 등록 테스트Test new user registration

앱 실행을 선택 합니다 등록 링크를 선택한 사용자를 등록 합니다.Run the app, select the Register link, and register a user. Entity Framework Core 마이그레이션을 실행 하는 지침을 따릅니다.Follow the instructions to run Entity Framework Core migrations. 이 시점에서 전자 메일에만 유효성 검사 된 합니다 [EmailAddress] 특성입니다.At this point, the only validation on the email is with the [EmailAddress] attribute. 등록을 제출 후 앱에 로그인 됩니다.After submitting the registration, you are logged into the app. 자습서의 뒷부분에 나오는 코드에는 전자 메일의 유효성이 검사 될 때까지 새 사용자가 로그인 할 수 없습니다 있도록 업데이트 됩니다.Later in the tutorial, the code is updated so new users can't log in until their email has been validated.

Id 데이터베이스 보기View the Identity database

참조 ASP.NET Core MVC 프로젝트에서 SQLite 작업 SQLite 데이터베이스를 보는 방법에 대 한 지침은 합니다.See Work with SQLite in an ASP.NET Core MVC project for instructions on how to view the SQLite database.

Visual studio:For Visual Studio:

  • 메뉴에서 SQL Server 개체 탐색기 (SSOX).From the View menu, select SQL Server Object Explorer (SSOX).
  • 이동할 (localdb) (SQL Server 13) MSSQLLocalDB합니다.Navigate to (localdb)MSSQLLocalDB(SQL Server 13). 마우스 오른쪽 단추로 클릭 dbo입니다. AspNetUsers > 데이터를 볼:Right-click on dbo.AspNetUsers > View Data:

SQL Server 개체 탐색기에서 AspNetUsers 테이블의 상황에 맞는 메뉴

테이블의 유의 EmailConfirmed 필드는 False합니다.Note the table's EmailConfirmed field is False.

앱에서 확인 전자 메일을 보낼 때 다음 단계에서는이 전자 메일에 다시 사용 하려는.You might want to use this email again in the next step when the app sends a confirmation email. 선택한 행을 마우스 오른쪽 단추로 클릭 삭제합니다.Right-click on the row and select Delete. 전자 메일 별칭을 삭제 하면 쉽게 다음 단계에 있습니다.Deleting the email alias makes it easier in the following steps.


HTTPS가 필요Require HTTPS

참조 Https/합니다.See Require HTTPS.

전자 메일 확인이 필요Require email confirmation

새 사용자 등록 전자 메일을 확인 하는 것이 좋습니다.It's a best practice to confirm the email of a new user registration. 다른 사람이 가장 하지는 확인 하려면 확인 하면 전자 메일 (즉, 다른 사용자의 전자 메일을 사용 하 여 등록 하지 않은).Email confirmation helps to verify they're not impersonating someone else (that is, they haven't registered with someone else's email). 토론 포럼을 했으며 방지 하려고 한다고 가정해 보겠습니다 "yli@example.com"등록"에서nolivetto@contoso.com"입니다.Suppose you had a discussion forum, and you wanted to prevent "yli@example.com" from registering as "nolivetto@contoso.com". 전자 메일 확인 하지 않고 "nolivetto@contoso.com" 앱에서 원치 않는 전자 메일을 받을 수 있습니다.Without email confirmation, "nolivetto@contoso.com" could receive unwanted email from your app. 사용자는 실수로로 등록 되어 있다고 가정 "ylo@example.com" 및 "yli"의 오타 눈치채 합니다.Suppose the user accidentally registered as "ylo@example.com" and hadn't noticed the misspelling of "yli". 이러한 앱에 올바른 전자 메일 없기 때문에 암호 복구를 사용 하려면 없게 됩니다.They wouldn't be able to use password recovery because the app doesn't have their correct email. 전자 메일 확인은 봇부터에서만 제한 된 보호를 제공합니다.Email confirmation provides only limited protection from bots. 전자 메일 확인 전자 메일 계정의 수를 사용 하 여 악의적인 사용자 로부터 보호를 제공 하지 않습니다.Email confirmation doesn't provide protection from malicious users with many email accounts.

일반적으로 새 사용자가 전자 메일을 확인된 하기 전에 먼저 웹 사이트에 데이터를 게시 하지 못하도록 좋습니다.You generally want to prevent new users from posting any data to your web site before they have a confirmed email.

업데이트 ConfigureServices 전자 메일을 확인된 해야 합니다.Update ConfigureServices to require a confirmed email:

public void ConfigureServices(IServiceCollection services)
{
    // Requires using Microsoft.AspNetCore.Mvc;
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>(config =>
    {
        config.SignIn.RequireConfirmedEmail = true;
    })
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeFolder("/Account/Manage");
            options.Conventions.AuthorizePage("/Account/Logout");
        });

config.SignIn.RequireConfirmedEmail = true; 등록 된 사용자를가 해당 전자 메일이 확인 될 때까지 로그인 수 없습니다.config.SignIn.RequireConfirmedEmail = true; prevents registered users from logging in until their email is confirmed.

전자 메일 공급자 구성Configure email provider

이 자습서에서는 SendGrid 전자 메일을 보내는 사용 됩니다.In this tutorial, SendGrid is used to send email. SendGrid 계정 및 전자 메일을 보내는 키 필요 합니다.You need a SendGrid account and key to send email. 다른 이메일 공급자를 사용할 수 있습니다.You can use other email providers. ASP.NET Core 2.x 포함 System.Net.Mail, 앱에서 전자 메일을 보낼 수 있습니다.ASP.NET Core 2.x includes System.Net.Mail, which allows you to send email from your app. 전자 메일을 보내려면 SendGrid 또는 다른 전자 메일 서비스를 사용 하는 것이 좋습니다.We recommend you use SendGrid or another email service to send email. SMTP를 보호 하 고 올바르게 설정 하기가 어렵습니다.SMTP is difficult to secure and set up correctly.

합니다 옵션 패턴 사용자 계정 및 키 설정에 액세스 하는 데 사용 됩니다.The Options pattern is used to access the user account and key settings. 자세한 내용은 구성합니다.For more information, see configuration.

전자 메일 보안 키를 인출 하는 클래스를 만듭니다.Create a class to fetch the secure email key. 이 샘플에서는 합니다 AuthMessageSenderOptions 클래스에 생성 됩니다 합니다 Services/AuthMessageSenderOptions.cs 파일:For this sample, the AuthMessageSenderOptions class is created in the Services/AuthMessageSenderOptions.cs file:

public class AuthMessageSenderOptions
{
        public string SendGridUser { get; set; }
        public string SendGridKey { get; set; }
}

설정 합니다 SendGridUser 하 고 SendGridKey 사용 하 여는 암호 관리자 도구합니다.Set the SendGridUser and SendGridKey with the secret-manager tool. 예를 들어:For example:

C:\WebAppl\src\WebApp1>dotnet user-secrets set SendGridUser RickAndMSFT
info: Successfully saved SendGridUser = RickAndMSFT to the secret store.

Windows, 암호 관리자의 키/값 쌍 저장 하는 secrets.json 파일을 %APPDATA%/Microsoft/UserSecrets/<WebAppName-userSecretsId> 디렉터리입니다.On Windows, Secret Manager stores keys/value pairs in a secrets.json file in the %APPDATA%/Microsoft/UserSecrets/<WebAppName-userSecretsId> directory.

콘텐츠를 secrets.json 파일 암호화 되지 않습니다.The contents of the secrets.json file aren't encrypted. 합니다 secrets.json 파일은 다음과 같습니다 (의 SendGridKey 값이 제거 되었습니다.)The secrets.json file is shown below (the SendGridKey value has been removed.)

 {
   "SendGridUser": "RickAndMSFT",
   "SendGridKey": "<key removed>"
 }

AuthMessageSenderOptions를 사용 하는 시작 구성Configure startup to use AuthMessageSenderOptions

추가 AuthMessageSenderOptions 끝에 서비스 컨테이너에는 ConfigureServices 에서 메서드는 Startup.cs 파일:Add AuthMessageSenderOptions to the service container at the end of the ConfigureServices method in the Startup.cs file:

public void ConfigureServices(IServiceCollection services)
{
    // Requires using Microsoft.AspNetCore.Mvc;
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>(config =>
    {
        config.SignIn.RequireConfirmedEmail = true;
    })
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeFolder("/Account/Manage");
            options.Conventions.AuthorizePage("/Account/Logout");
        });

    services.AddSingleton<IEmailSender, EmailSender>();

    services.Configure<AuthMessageSenderOptions>(Configuration);
}

AuthMessageSender 클래스 구성Configure the AuthMessageSender class

이 자습서를 통해 전자 메일 알림을 추가 하는 방법을 보여 줍니다 SendGrid, 하지만 SMTP 및 다른 메커니즘을 사용 하 여 메일을 보낼 수 있습니다.This tutorial shows how to add email notifications through SendGrid, but you can send email using SMTP and other mechanisms.

설치는 SendGrid NuGet 패키지:Install the SendGrid NuGet package:

  • 명령줄:From the command line:

    dotnet add package SendGrid

  • 패키지 관리자 콘솔에서 다음 명령을 입력 합니다.From the Package Manager Console, enter the following command:

    Install-Package SendGrid

참조 SendGrid를 사용 하 여 시작 해 보세요 무료 SendGrid 계정을 등록 합니다.See Get Started with SendGrid for Free to register for a free SendGrid account.

SendGrid 구성Configure SendGrid

SendGrid를 구성 하려면에 다음과 비슷한 코드를 추가 Services/EmailSender.cs:To configure SendGrid, add code similar to the following in Services/EmailSender.cs:

using Microsoft.Extensions.Options;
using SendGrid;
using SendGrid.Helpers.Mail;
using System.Threading.Tasks;

namespace WebPWrecover.Services
{
    public class EmailSender : IEmailSender
    {
        public EmailSender(IOptions<AuthMessageSenderOptions> optionsAccessor)
        {
            Options = optionsAccessor.Value;
        }

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

        public Task SendEmailAsync(string email, string subject, string message)
        {
            return Execute(Options.SendGridKey, subject, message, email);
        }

        public Task Execute(string apiKey, string subject, string message, string email)
        {
            var client = new SendGridClient(apiKey);
            var msg = new SendGridMessage()
            {
                From = new EmailAddress("Joe@contoso.com", "Joe Smith"),
                Subject = subject,
                PlainTextContent = message,
                HtmlContent = message
            };
            msg.AddTo(new EmailAddress(email));
            return client.SendEmailAsync(msg);
        }
    }
}

계정 확인 및 암호 복구를 사용 하도록 설정Enable account confirmation and password recovery

서식 파일에 계정 확인 및 암호 복구를 위한 코드가 있습니다.The template has the code for account confirmation and password recovery. 찾을 합니다 OnPostAsync 의 메서드 Pages/Account/Register.cshtml.cs합니다.Find the OnPostAsync method in Pages/Account/Register.cshtml.cs.

다음 줄을 주석으로 자동으로 로그온 하에서 새로 등록 된 사용자를 방지 합니다.Prevent newly registered users from being automatically logged on by commenting out the following line:

await _signInManager.SignInAsync(user, isPersistent: false);

전체 메서드는 강조 표시 된 변경 된 줄으로 표시 됩니다.The complete method is shown with the changed line highlighted:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    ReturnUrl = returnUrl;
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            var callbackUrl = Url.EmailConfirmationLink(user.Id, code, Request.Scheme);
            await _emailSender.SendEmailConfirmationAsync(Input.Email, callbackUrl);

            // await _signInManager.SignInAsync(user, isPersistent: false);
            return LocalRedirect(Url.GetLocalUrl(returnUrl));
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

등록 하 고, 전자 메일을 확인 하 고, 암호 재설정Register, confirm email, and reset password

웹 앱을 실행 하 고 계정 확인 및 암호 복구 흐름을 테스트 합니다.Run the web app, and test the account confirmation and password recovery flow.

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

    웹 응용 프로그램 계정 등록 보기

  • 계정 확인 링크에 대 한 전자 메일을 확인 합니다.Check your email for the account confirmation link. 참조 전자 메일을 디버그 전자 메일을 얻지 못한 경우.See Debug email if you don't get the email.

  • 전자 메일 확인 하기 위한 링크를 클릭 합니다.Click the link to confirm your email.

  • 전자 메일 및 암호를 로그인 합니다.Log in with your email and password.

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

관리 페이지 보기View the manage page

브라우저에서 사용자 이름을 선택 합니다. 사용자 이름이 있는 브라우저 창Select your user name in the browser: browser window with user name

사용자 이름을 보려면 탐색 모음을 확장 해야 합니다.You might need to expand the navbar to see user name.

탐색 모음

사용 하 여 관리 페이지가 표시 되는 프로필 탭이 선택 합니다.The manage page is displayed with the Profile tab selected. 합니다 전자 메일 확인 된 전자 메일을 나타내는 확인란을 보여 줍니다.The Email shows a check box indicating the email has been confirmed.

관리 페이지

테스트 암호 재설정Test password reset

  • 에 로그인 하는 경우 선택 로그 아웃합니다.If you're logged in, select Logout.
  • 선택 합니다 에 로그인 연결 하 고 선택 합니다 암호를 잊으셨나요? 링크.Select the Log in link and select the Forgot your password? link.
  • 계정을 등록 하는 데 전자 메일을 입력 합니다.Enter the email you used to register the account.
  • 암호 재설정에 대 한 링크가 포함 된 전자 메일이 전송 됩니다.An email with a link to reset your password is sent. 전자 메일을 확인 하 고 암호 재설정에 대 한 링크를 클릭 합니다.Check your email and click the link to reset your password. 암호가 성공적으로 다시 설정, 메일 및 새 암호를 사용 하 여 기록할 수 있습니다.After your password has been successfully reset, you can log in with your email and new password.

전자 메일을 디버그Debug email

경우 전자 메일 작업을 가져올 수 없습니다.If you can't get email working:

  • 만들기는 전자 메일을 보내는 콘솔 앱을입니다.Create a console app to send email.
  • 검토 합니다 전자 메일 작업 페이지입니다.Review the Email Activity page.
  • 스팸 폴더를 확인 합니다.Check your spam folder.
  • 다른 전자 메일 별칭에는 다른 전자 메일 공급자 (Microsoft, Yahoo, Gmail 등)를 시도 하세요.Try another email alias on a different email provider (Microsoft, Yahoo, Gmail, etc.)
  • 다른 메일 계정으로 보내기를 시도 합니다.Try sending to different email accounts.

보안 모범 사례 하는 것 하지 테스트 및 개발에서 프로덕션 비밀을 사용 합니다.A security best practice is to not use production secrets in test and development. Azure에 앱을 게시 하는 경우 Azure 웹 앱 포털에서 응용 프로그램 설정으로 SendGrid 비밀을 설정할 수 있습니다.If you publish the app to Azure, you can set the SendGrid secrets as application settings in the Azure Web App portal. 구성 시스템 환경 변수에서 키를 읽을 수 설정 됩니다.The configuration system is set up to read keys from environment variables.

로컬 및 소셜 로그인 계정을 병합합니다Combine social and local login accounts

이 섹션을 완료 하려면 먼저 외부 인증 공급자를 활성화 해야 합니다.To complete this section, you must first enable an external authentication provider. 참조 Facebook, Google 및 외부 공급자 인증합니다.See Facebook, Google, and external provider authentication.

로컬 및 소셜 계정 전자 메일 링크를 클릭 하 여 결합할 수 있습니다.You can combine local and social accounts by clicking on your email link. 그러나 다음 순서로 "RickAndMSFT@gmail.com" 로컬 로그인;으로 처음 만들어질 수 계정으로 소셜 로그인을 먼저 만든 다음 로컬 로그인을 추가 합니다.In the following sequence, "RickAndMSFT@gmail.com" is first created as a local login; however, you can create the account as a social login first, then add a local login.

웹 응용 프로그램: RickAndMSFT 인증 된 사용자

클릭 합니다 관리 링크 합니다.Click on the Manage link. 이 계정과 연결 된 참고 0 외부 (소셜 로그인)Note the 0 external (social logins) associated with this account.

보기 관리

다른 로그인 서비스에 대 한 링크를 클릭 하 고 앱 요청을 수락 합니다.Click the link to another login service and accept the app requests. 다음 이미지에서는 Facebook는 외부 인증 공급자:In the following image, Facebook is the external authentication provider:

Facebook을 목록 외부 로그인 보기를 관리 합니다.

두 개의 계정은 결합 되었습니다.The two accounts have been combined. 두 계정으로 로그온 할 수 있습니다.You are able to log on with either account. 사용자가 자신의 소셜 로그인 인증 서비스가 다운 된 또는 가능성이 소셜 계정에 대 한 액세스를 손실 했습니다 되는 경우 로컬 계정을 추가 수 있습니다.You might want your users to add local accounts in case their social login authentication service is down, or more likely they've lost access to their social account.

사이트 사용자 후 계정 확인을 사용 하도록 설정Enable account confirmation after a site has users

사용자를 사용 하 여 사이트에서 계정 확인을 사용 하도록 설정 하면 모든 기존 사용자를 잠급니다.Enabling account confirmation on a site with users locks out all the existing users. 해당 계정 확인 되지 때문에 기존 사용자가 잠겨 있습니다.Existing users are locked out because their accounts aren't confirmed. 기존 사용자 잠금 문제를 해결 하려면 다음 방법 중 하나를 사용 합니다.To work around existing user lockout, use one of the following approaches:

  • 로 확인 되 고 모든 기존 사용자를 표시 하도록 데이터베이스를 업데이트 합니다.Update the database to mark all existing users as being confirmed.
  • 기존 사용자를 확인 합니다.Confirm exiting users. 예를 들어 일괄 처리-송신 확인 링크를 사용 하 여 전자 메일입니다.For example, batch-send emails with confirmation links.