IdentityASP.NET Core の概要Introduction to Identity on ASP.NET Core

作成者: Rick AndersonBy Rick Anderson

ASP.NET Core Identity:ASP.NET Core Identity:

  • は、ユーザーインターフェイス (UI) のログイン機能をサポートする API です。Is an API that supports user interface (UI) login functionality.
  • ユーザー、パスワード、プロファイルデータ、ロール、要求、トークン、電子メールの確認などを管理します。Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.

ユーザーは、に格納されているログイン情報を持つアカウントを作成することも、外部ログインプロバイダーを使用することもでき Identity ます。Users can create an account with the login information stored in Identity or they can use an external login provider. サポートされている外部ログインプロバイダーには、 Facebook、Google、Microsoft アカウント、Twitterがあります。Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

すべてのユーザーの認証をグローバルに要求する方法の詳細については、「認証されたユーザーを要求する」を参照してください。For information on how to globally require all users to be authenticated, see Require authenticated users.

Identity ソースコードは GitHub で入手できます。The Identity source code is available on GitHub. スキャフォールディング Identity 生成されたファイルを表示して、テンプレートとの対話を確認し Identity ます。Scaffold Identity and view the generated files to review the template interaction with Identity.

Identity は、通常、ユーザー名、パスワード、およびプロファイルデータを格納するために SQL Server データベースを使用して構成されます。Identity is typically configured using a SQL Server database to store user names, passwords, and profile data. 別の永続ストアを使用することもできます (たとえば、Azure Table Storage)。Alternatively, another persistent store can be used, for example, Azure Table Storage.

このトピックでは、を使用し Identity てユーザーを登録、ログイン、ログアウトする方法について説明します。In this topic, you learn how to use Identity to register, log in, and log out a user. 注: このテンプレートでは、ユーザー名と電子メールはユーザーに対して同じものとして扱われます。Note: the templates treat username and email as the same for users. を使用するアプリを作成する方法の詳細について Identity は、「 次のステップ」を参照してください。For more detailed instructions about creating apps that use Identity, see Next Steps.

Microsoft id プラットフォーム は次のとおりです。Microsoft identity platform is:

  • Azure Active Directory (Azure AD) 開発プラットフォームの進化。An evolution of the Azure Active Directory (Azure AD) developer platform.
  • に関連付けら ASP.NET Core Identity れていません。Unrelated to ASP.NET Core Identity.

ASP.NET Core Identity では、ASP.NET Core Web アプリにユーザー インターフェイス (UI) ログイン機能が追加されます。ASP.NET Core Identity adds user interface (UI) login functionality to ASP.NET Core web apps. Web API と SPA をセキュリティで保護するには、次のいずれかを使用します。To secure web APIs and SPAs, use one of the following:

IdentityServer4 は、ASP.NET Core 用の OpenID Connect および OAuth 2.0 フレームワークです。IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core. IdentityServer4 により、次のセキュリティ機能が有効になります。IdentityServer4 enables the following security features:

  • サービスとしての認証 (AaaS)Authentication as a Service (AaaS)
  • 複数のアプリケーションの種類でのシングル サインオン/オフ (SSO)Single sign-on/off (SSO) over multiple application types
  • API のアクセス制御Access control for APIs
  • Federation GatewayFederation Gateway

詳細については、「ようこそ! IdentityServer4」を参照してください。For more information, see Welcome to IdentityServer4.

サンプルコードを表示またはダウンロード します (ダウンロード方法)。View or download the sample code (how to download).

認証を使用して Web アプリを作成するCreate a Web app with authentication

個々のユーザーアカウントを使用して ASP.NET Core Web アプリケーションプロジェクトを作成します。Create an ASP.NET Core Web Application project with Individual User Accounts.

  • [ファイル] [新しいプロジェクト] を選択し > New > Project ます。Select File > New > Project.
  • [ASP.NET Core Web アプリケーション] を選択します。Select ASP.NET Core Web Application. プロジェクトに WebApp1 という名前を付け、プロジェクトのダウンロードと同じ名前空間にします。Name the project WebApp1 to have the same namespace as the project download. [OK] をクリックします。Click OK.
  • ASP.NET Core Web アプリケーション を選択し、[ 認証の変更] を選択します。Select an ASP.NET Core Web Application, then select Change Authentication.
  • 個々のユーザーアカウント を選択し、[ OK] をクリックします。Select Individual User Accounts and click OK.

生成されたプロジェクトは ASP.NET Core Identity Razor クラスライブラリとしてを提供します。The generated project provides ASP.NET Core Identity as a Razor Class Library. Identity Razor クラスライブラリは、領域と共にエンドポイントを公開し Identity ます。The Identity Razor Class Library exposes endpoints with the Identity area. 次に例を示します。For example:

  • /Identity/Account/Login/Identity/Account/Login
  • /Identity/アカウント/ログアウト/Identity/Account/Logout
  • /Identity/アカウント/管理/Identity/Account/Manage

移行を適用するApply migrations

移行を適用してデータベースを初期化します。Apply the migrations to initialize the database.

パッケージマネージャーコンソール (PMC) で次のコマンドを実行します。Run the following command in the Package Manager Console (PMC):

PM> Update-Database

テストレジスタとログインTest Register and Login

アプリを実行し、ユーザーを登録します。Run the app and register a user. 画面のサイズによっては、[ナビゲーション] トグルボタンを選択して、 登録 リンクと ログイン リンクを表示する必要がある場合があります。Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Id データベースを表示するView the Identity database

  • [表示] メニューの [SQL Server オブジェクトエクスプローラー] (ssox) を選択します。From the View menu, select SQL Server Object Explorer (SSOX).
  • (Localdb) MSSQLLocalDB (SQL Server 13) に移動します。Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Dbo を右クリックします。AspNetUsers > ビューデータ:Right-click on dbo.AspNetUsers > View Data:

SQL Server オブジェクトエクスプローラーの AspNetUsers テーブルのコンテキストメニュー

サービスの構成 IdentityConfigure Identity services

サービスはに追加されて ConfigureServices います。Services are added in ConfigureServices. 一般的なパターンは、すべての Add{Service} メソッドを呼び出した後、すべての services.Configure{Service} メソッドを呼び出すことです。The typical pattern is to call all the Add{Service} methods, and then call all the services.Configure{Service} methods.

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

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });
}

前の強調表示されたコードは、 Identity 既定のオプション値を使用してを構成します。The preceding highlighted code configures Identity with default option values. サービスは、 依存関係の挿入によってアプリで使用できるようになります。Services are made available to the app through dependency injection.

Identity は、を呼び出すことによって有効になり UseAuthentication ます。Identity is enabled by calling UseAuthentication. UseAuthentication 認証 ミドルウェア を要求パイプラインに追加します。UseAuthentication adds authentication middleware to the request pipeline.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseRouting();

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

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        // options.UseSqlite(
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });
}

前のコードでは、 Identity 既定のオプション値を使用してを構成します。The preceding code configures Identity with default option values. サービスは、 依存関係の挿入によってアプリで使用できるようになります。Services are made available to the app through dependency injection.

Identity は、 Useauthenticationを呼び出すことによって有効になります。Identity is enabled by calling UseAuthentication. UseAuthentication 認証 ミドルウェア を要求パイプラインに追加します。UseAuthentication adds authentication middleware to the request pipeline.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseRouting();

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

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

テンプレートで生成されたアプリは、 承認を使用しません。The template-generated app doesn't use authorization. app.UseAuthorization は、アプリが承認を追加する正しい順序で追加されるようにするために用意されています。app.UseAuthorization is included to ensure it's added in the correct order should the app add authorization. UseRoutingUseAuthenticationUseAuthorization 、および UseEndpoints は、前のコードに示されている順序で呼び出す必要があります。UseRouting, UseAuthentication, UseAuthorization, and UseEndpoints must be called in the order shown in the preceding code.

およびの詳細に IdentityOptions つい Startup ては、「」および「アプリケーションの起動」を参照してください IdentityOptionsApplication StartupFor more information on IdentityOptions and Startup, see IdentityOptions and Application Startup.

スキャフォールディング Register、Login、LogOut、および RegisterConfirmationScaffold Register, Login, LogOut, and RegisterConfirmation

、、、およびの各ファイルを追加し Register Login LogOut RegisterConfirmation ます。Add the Register, Login, LogOut, and RegisterConfirmation files. このセクションに示されているコードを生成するための Razor 承認手順を含むプロジェクトに、スキャフォールディング id に従います。Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

レジスタの確認Examine Register

ユーザーがページの [ 登録 ] ボタンをクリックすると、 Register RegisterModel.OnPostAsync アクションが呼び出されます。When a user clicks the Register button on the Register page, the RegisterModel.OnPostAsync action is invoked. ユーザーは、オブジェクトに対して Createasync によって作成され _userManager ます。The user is created by CreateAsync on the _userManager object:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
                                          .ToList();
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { 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);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            if (_userManager.Options.SignIn.RequireConfirmedAccount)
            {
                return RedirectToPage("RegisterConfirmation", 
                                      new { email = Input.Email });
            }
            else
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                return LocalRedirect(returnUrl);
            }
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

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

既定のアカウントの検証を無効にするDisable default account verification

既定のテンプレートでは、ユーザーはにリダイレクトされ Account.RegisterConfirmation ます。ここで、アカウントを確認するためのリンクを選択できます。With the default templates, the user is redirected to the Account.RegisterConfirmation where they can select a link to have the account confirmed. 既定値 Account.RegisterConfirmation はテストにのみ使用され、運用アプリでは自動アカウント検証を無効にする必要があります。The default Account.RegisterConfirmation is used only for testing, automatic account verification should be disabled in a production app.

確認済みのアカウントを要求し、登録時にすぐにログインできないようにするには、 DisplayConfirmAccountLink = false /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.csでを設定します。To require a confirmed account and prevent immediate login at registration, set DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs:

[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly IEmailSender _sender;

    public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
    {
        _userManager = userManager;
        _sender = sender;
    }

    public string Email { get; set; }

    public bool DisplayConfirmAccountLink { get; set; }

    public string EmailConfirmationUrl { get; set; }

    public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
    {
        if (email == null)
        {
            return RedirectToPage("/Index");
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return NotFound($"Unable to load user with email '{email}'.");
        }

        Email = email;
        // Once you add a real email sender, you should remove this code that lets you confirm the account
        DisplayConfirmAccountLink = false;
        if (DisplayConfirmAccountLink)
        {
            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            EmailConfirmationUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
                protocol: Request.Scheme);
        }

        return Page();
    }
}

ログインLog in

ログインフォームは次の場合に表示されます。The Login form is displayed when:

  • ログイン リンクが選択されています。The Log in link is selected.
  • ユーザーがアクセスを承認されていない、 または システムによって認証されていない制限付きページにアクセスしようとしています。A user attempts to access a restricted page that they aren't authorized to access or when they haven't been authenticated by the system.

ログインページのフォームが送信されると、 OnPostAsync アクションが呼び出されます。When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsync は、オブジェクトで呼び出され _signInManager ます。PasswordSignInAsync is called on the _signInManager object.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email,
                           Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new
            {
                ReturnUrl = returnUrl,
                RememberMe = Input.RememberMe
            });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

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

承認決定を行う方法については、「」を参照してください ASP.NET Core での承認の概要For information on how to make authorization decisions, see ASP.NET Core での承認の概要.

ログアウトLog out

[ ログアウト すると、アクションが呼び出され LogoutModel.OnPost ます。The Log out link invokes the LogoutModel.OnPost action.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return RedirectToPage();
            }
        }
    }
}

前のコードでは、 return RedirectToPage(); ブラウザーが新しい要求を実行し、ユーザーの id が更新されるように、コードをリダイレクトにする必要があります。In the preceding code, the code return RedirectToPage(); needs to be a redirect so that the browser performs a new request and the identity for the user gets updated.

署名 は、に格納されているユーザーの要求をクリア cookie します。SignOutAsync clears the user's claims stored in a cookie.

Post は Pages/Shared/_LoginPartial に指定されています。Post is specified in the Pages/Shared/_LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <a  class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" 
                                              title="Manage">Hello @User.Identity.Name!</a>
    </li>
    <li class="nav-item">
        <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                                  asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                                  method="post" >
            <button  type="submit" class="nav-link btn btn-link text-dark">Logout</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
}
</ul>

Test IdentityTest Identity

既定の web プロジェクトテンプレートでは、ホームページへの匿名アクセスが許可されます。The default web project templates allow anonymous access to the home pages. テストするには Identity 、次のように追加し [Authorize] ます。To test Identity, add [Authorize]:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        private readonly ILogger<PrivacyModel> _logger;

        public PrivacyModel(ILogger<PrivacyModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
        }
    }
}

サインインしている場合は、サインアウトします。アプリを実行し、[ プライバシー ] リンクを選択します。If you are signed in, sign out. Run the app and select the Privacy link. ログイン ページにリダイレクトされます。You are redirected to the login page.

Tsm IdentityExplore Identity

詳細については、次を参照して Identity ください。To explore Identity in more detail:

Identity コンポーネントIdentity Components

すべての Identity 依存する NuGet パッケージは、 ASP.NET Core 共有フレームワークに含まれています。All the Identity-dependent NuGet packages are included in the ASP.NET Core shared framework.

のプライマリパッケージ Identity はAspNetCore です Identity The primary package for Identity is Microsoft.AspNetCore.Identity. このパッケージには、のインターフェイスのコアセットが含まれており、によって含まれてい ASP.NET Core Identity Microsoft.AspNetCore.Identity.EntityFrameworkCore ます。This package contains the core set of interfaces for ASP.NET Core Identity, and is included by Microsoft.AspNetCore.Identity.EntityFrameworkCore.

移行先 ASP.NET Core IdentityMigrating to ASP.NET Core Identity

既存のストアの移行に関する詳細とガイダンスについて Identity は、「認証と Identity の移行」を参照してください。For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

パスワードの強度を設定するSetting password strength

パスワードの最小要件を設定するサンプルについては、「 構成 」を参照してください。See Configuration for a sample that sets the minimum password requirements.

AddDefault Identity と AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentity は ASP.NET Core 2.1 で導入されました。AddDefaultIdentity was introduced in ASP.NET Core 2.1. AddDefaultIdentityの呼び出しは、次の呼び出しに似ています。Calling AddDefaultIdentity is similar to calling the following:

詳細については、「 Adddefault Identity source 」を参照してください。See AddDefaultIdentity source for more information.

静的アセットの発行を禁止する IdentityPrevent publish of static Identity assets

静的 Identity アセット (UI 用のスタイルシートおよび JavaScript ファイル) を web ルートに発行できないようにするには Identity 、 ResolveStaticWebAssetsInputsDependsOn RemoveIdentityAssets アプリケーションのプロジェクトファイルに次のプロパティとターゲットを追加します。To prevent publishing static Identity assets (stylesheets and JavaScript files for Identity UI) to the web root, add the following ResolveStaticWebAssetsInputsDependsOn property and RemoveIdentityAssets target to the app's project file:

<PropertyGroup>
  <ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>

<Target Name="RemoveIdentityAssets">
  <ItemGroup>
    <StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
  </ItemGroup>
</Target>

次の手順Next Steps

作成者: Rick AndersonBy Rick Anderson

ASP.NET Core Identity は、ASP.NET Core アプリにログイン機能を追加するメンバーシップシステムです。ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. ユーザーは、に格納されているログイン情報を持つアカウントを作成することも、外部ログインプロバイダーを使用することもでき Identity ます。Users can create an account with the login information stored in Identity or they can use an external login provider. サポートされている外部ログインプロバイダーには、 Facebook、Google、Microsoft アカウント、Twitterがあります。Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

Identity SQL Server データベースを使用して、ユーザー名、パスワード、およびプロファイルデータを格納するように構成できます。Identity can be configured using a SQL Server database to store user names, passwords, and profile data. 別の永続ストアを使用することもできます (たとえば、Azure Table Storage)。Alternatively, another persistent store can be used, for example, Azure Table Storage.

サンプルコードを表示またはダウンロード します (ダウンロード方法)。View or download the sample code (how to download).

このトピックでは、を使用し Identity てユーザーを登録、ログイン、ログアウトする方法について説明します。In this topic, you learn how to use Identity to register, log in, and log out a user. を使用するアプリを作成する方法の詳細については Identity 、この記事の最後にある「次のステップ」を参照してください。For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

AddDefault Identity と AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentity は ASP.NET Core 2.1 で導入されました。AddDefaultIdentity was introduced in ASP.NET Core 2.1. AddDefaultIdentityの呼び出しは、次の呼び出しに似ています。Calling AddDefaultIdentity is similar to calling the following:

詳細については、「 Adddefault Identity source 」を参照してください。See AddDefaultIdentity source for more information.

認証を使用して Web アプリを作成するCreate a Web app with authentication

個々のユーザーアカウントを使用して ASP.NET Core Web アプリケーションプロジェクトを作成します。Create an ASP.NET Core Web Application project with Individual User Accounts.

  • [ファイル] [新しいプロジェクト] を選択し > New > Project ます。Select File > New > Project.
  • [ASP.NET Core Web アプリケーション] を選択します。Select ASP.NET Core Web Application. プロジェクトに WebApp1 という名前を付け、プロジェクトのダウンロードと同じ名前空間にします。Name the project WebApp1 to have the same namespace as the project download. [OK] をクリックします。Click OK.
  • ASP.NET Core Web アプリケーション を選択し、[ 認証の変更] を選択します。Select an ASP.NET Core Web Application, then select Change Authentication.
  • 個々のユーザーアカウント を選択し、[ OK] をクリックします。Select Individual User Accounts and click OK.

生成されたプロジェクトは ASP.NET Core Identity Razor クラスライブラリとしてを提供します。The generated project provides ASP.NET Core Identity as a Razor Class Library. Identity Razor クラスライブラリは、領域と共にエンドポイントを公開し Identity ます。The Identity Razor Class Library exposes endpoints with the Identity area. 次に例を示します。For example:

  • /Identity/Account/Login/Identity/Account/Login
  • /Identity/アカウント/ログアウト/Identity/Account/Logout
  • /Identity/アカウント/管理/Identity/Account/Manage

移行を適用するApply migrations

移行を適用してデータベースを初期化します。Apply the migrations to initialize the database.

パッケージマネージャーコンソール (PMC) で次のコマンドを実行します。Run the following command in the Package Manager Console (PMC):

Update-Database

テストレジスタとログインTest Register and Login

アプリを実行し、ユーザーを登録します。Run the app and register a user. 画面のサイズによっては、[ナビゲーション] トグルボタンを選択して、 登録 リンクと ログイン リンクを表示する必要がある場合があります。Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Id データベースを表示するView the Identity database

  • [表示] メニューの [SQL Server オブジェクトエクスプローラー] (ssox) を選択します。From the View menu, select SQL Server Object Explorer (SSOX).
  • (Localdb) MSSQLLocalDB (SQL Server 13) に移動します。Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Dbo を右クリックします。AspNetUsers > ビューデータ:Right-click on dbo.AspNetUsers > View Data:

SQL Server オブジェクトエクスプローラーの AspNetUsers テーブルのコンテキストメニュー

サービスの構成 IdentityConfigure Identity services

サービスはに追加されて ConfigureServices います。Services are added in ConfigureServices. 一般的なパターンは、すべての Add{Service} メソッドを呼び出した後、すべての services.Configure{Service} メソッドを呼び出すことです。The typical pattern is to call all the Add{Service} methods, and then call all the services.Configure{Service} methods.

前のコードでは、 Identity 既定のオプション値を使用してを構成します。The preceding code configures Identity with default option values. サービスは、 依存関係の挿入によってアプリで使用できるようになります。Services are made available to the app through dependency injection.

Identity は、 Useauthenticationを呼び出すことによって有効になります。Identity is enabled by calling UseAuthentication. UseAuthentication 認証 ミドルウェア を要求パイプラインに追加します。UseAuthentication adds authentication middleware to the request pipeline.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseAuthentication();

    app.UseMvc();
}

詳細については、「 Identity オプションクラス」と「アプリケーションの起動」を参照してください。For more information, see the IdentityOptions Class and Application Startup.

スキャフォールディング Register、Login、および LogOutScaffold Register, Login, and LogOut

このセクションに示されているコードを生成するための Razor 承認手順を含むプロジェクトに、スキャフォールディング id に従います。Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Register、Login、および LogOut の各ファイルを追加します。Add the Register, Login, and LogOut files.

レジスタの確認Examine Register

ユーザーが [ 登録 ] リンクをクリックすると、 RegisterModel.OnPostAsync アクションが呼び出されます。When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. ユーザーは、オブジェクトに対して Createasync によって作成され _userManager ます。The user is created by CreateAsync on the _userManager object:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { 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.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

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

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

ユーザーが正常に作成された場合は、の呼び出しによってユーザーがログインし _signInManager.SignInAsync ます。If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

注: 登録時にすぐにログインできないようにする手順については、「 アカウントの確認 」をご覧ください。Note: See account confirmation for steps to prevent immediate login at registration.

ログインLog in

ログインフォームは次の場合に表示されます。The Login form is displayed when:

  • ログイン リンクが選択されています。The Log in link is selected.
  • ユーザーがアクセスを承認されていない、 または システムによって認証されていない制限付きページにアクセスしようとしています。A user attempts to access a restricted page that they aren't authorized to access or when they haven't been authenticated by the system.

ログインページのフォームが送信されると、 OnPostAsync アクションが呼び出されます。When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsync は、オブジェクトで呼び出され _signInManager ます。PasswordSignInAsync is called on the _signInManager object.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email, 
            Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

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

承認決定を行う方法については、「」を参照してください ASP.NET Core での承認の概要For information on how to make authorization decisions, see ASP.NET Core での承認の概要.

ログアウトLog out

[ ログアウト すると、アクションが呼び出され LogoutModel.OnPost ます。The Log out link invokes the LogoutModel.OnPost action.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                // This needs to be a redirect so that the browser performs a new
                // request and the identity for the user gets updated.
                return RedirectToPage();
            }
        }
    }
}

署名 は、に格納されているユーザーの要求をクリア cookie します。SignOutAsync clears the user's claims stored in a cookie.

Post は Pages/Shared/_LoginPartial に指定されています。Post is specified in the Pages/Shared/_LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
    @if (SignInManager.IsSignedIn(User))
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity"
               asp-page="/Account/Manage/Index"
               title="Manage">Hello@User.Identity.Name!</a>
        </li>
        <li class="nav-item">
            <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                   asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                   method="post">
                <button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
        </li>
    }
</ul>


Test IdentityTest Identity

既定の web プロジェクトテンプレートでは、ホームページへの匿名アクセスが許可されます。The default web project templates allow anonymous access to the home pages. をテストするに Identity は、[ [Authorize] プライバシー] ページにを追加します。To test Identity, add [Authorize] to the Privacy page.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

サインインしている場合は、サインアウトします。アプリを実行し、[ プライバシー ] リンクを選択します。If you are signed in, sign out. Run the app and select the Privacy link. ログイン ページにリダイレクトされます。You are redirected to the login page.

Tsm IdentityExplore Identity

詳細については、次を参照して Identity ください。To explore Identity in more detail:

Identity コンポーネントIdentity Components

すべての Identity 依存する NuGet パッケージは、 AspNetCore メタパッケージに含まれています。All the Identity dependent NuGet packages are included in the Microsoft.AspNetCore.App metapackage.

のプライマリパッケージ Identity はAspNetCore です Identity The primary package for Identity is Microsoft.AspNetCore.Identity. このパッケージには、のインターフェイスのコアセットが含まれており、によって含まれてい ASP.NET Core Identity Microsoft.AspNetCore.Identity.EntityFrameworkCore ます。This package contains the core set of interfaces for ASP.NET Core Identity, and is included by Microsoft.AspNetCore.Identity.EntityFrameworkCore.

移行先 ASP.NET Core IdentityMigrating to ASP.NET Core Identity

既存のストアの移行に関する詳細とガイダンスについて Identity は、「認証と Identity の移行」を参照してください。For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

パスワードの強度を設定するSetting password strength

パスワードの最小要件を設定するサンプルについては、「 構成 」を参照してください。See Configuration for a sample that sets the minimum password requirements.

次の手順Next Steps