ASP.NET Identity Core の概要

作成者: Rick Anderson

ASP.NET Core Identity:

  • ユーザー インターフェイス (UI) ログイン機能をサポートする API です。
  • ユーザー、パスワード、プロファイル データ、ロール、要求、トークン、電子メールの確認などについて管理します。

ユーザーは、 に格納されているログイン情報を持つアカウントを作成するか、 Identity 外部ログイン プロバイダーを使用できます。 サポートされている外部ログイン プロバイダーには 、Facebook、Google、Microsoft アカウント、Twitter があります

すべてのユーザーの認証をグローバルに要求する方法の詳細については、「認証されたユーザーを要求する」を参照してください。

ソース Identity コードはGitHub で入手できます。 ス Identity キャフォールディング生成されたファイルを表示して、 とのテンプレートの相互作用を確認します Identity 。

Identity は通常、ユーザー名、パスワードSQL Serverプロファイル データを格納するために、データベースを使用して構成されます。 または、別の永続ストアを使用できます (たとえば、Azure Table Storage)。

このトピックでは、 を使用してユーザーの Identity 登録、ログイン、およびログアウトを行う方法について説明します。 注: テンプレートでは、ユーザー名と電子メールはユーザーと同じとして扱います。 を使用するアプリの作成に関する詳細な手順については、「次 Identity の手順」 を参照してください

Microsoft ID プラットフォームは次 の条件を持っています。

  • Azure Active Directory (Azure AD) 開発者プラットフォームの進化。
  • とは無関係 ASP.NET Core Identity です。

ASP.NET Core Identity では、ASP.NET Core Web アプリにユーザー インターフェイス (UI) ログイン機能が追加されます。 Web API と SPA をセキュリティで保護するには、次のいずれかを使用します。

IdentityServer4 は、ASP.NET Core 用の OpenID Connect および OAuth 2.0 フレームワークです。 IdentityServer4 により、次のセキュリティ機能が有効になります。

  • サービスとしての認証 (AaaS)
  • 複数のアプリケーションの種類でのシングル サインオン/オフ (SSO)
  • API のアクセス制御
  • Federation Gateway

詳細については、「ようこそ! IdentityServer4」を参照してください。

サンプル コード (ダウンロード方法 )を表示またはダウンロードします

認証を使用して Web アプリを作成する

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

  • [ファイル] [新しいプロジェクト] を選択し > > ます。
  • [ASP.NET Core Web アプリケーション] を選択します。 プロジェクトに WebApp1 という名前を付け、プロジェクトのダウンロードと同じ名前空間にします。 [OK] をクリックします。
  • ASP.NET Core Web アプリケーション を選択し、[ 認証の変更] を選択します。
  • 個々のユーザーアカウント を選択し、[ OK] をクリックします。

生成されたプロジェクトは ASP.NET Core Identity Razor クラスライブラリとしてを提供します。 Identity Razor クラスライブラリは、領域と共にエンドポイントを公開し Identity ます。 次に例を示します。

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

移行を適用する

移行を適用してデータベースを初期化します。

パッケージマネージャーコンソール (PMC) で次のコマンドを実行します。

PM> Update-Database

テストレジスタとログイン

アプリを実行し、ユーザーを登録します。 画面のサイズによっては、[ナビゲーション] トグルボタンを選択して、 登録 リンクと ログイン リンクを表示する必要がある場合があります。

データベースを表示 Identity する

  • [表示] メニュー[SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
  • (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo を右 クリックします。AspNetUsers > View Data:

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

サービスの構成 Identity

サービスは に追加されます ConfigureServices 。 一般的なパターンは、すべての Add{Service} メソッドを呼び出した後、すべての services.Configure{Service} メソッドを呼び出すことです。

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 オプション値で構成されます。 サービスは、依存関係の挿入 によってアプリ で使用できます

Identity は、 を呼び出すことによって有効になります UseAuthenticationUseAuthentication は、要求 パイプライン に認証ミドルウェアを追加します。

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 オプション値を使用して を構成します。 サービスは、依存関係の挿入 によってアプリ で使用できます

Identity は 、UseAuthentication を呼び出すことによって有効になりますUseAuthentication は、要求 パイプライン に認証ミドルウェアを追加します。

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();
    });
}

テンプレートで生成されたアプリでは、承認 は使用 されませんapp.UseAuthorization は、アプリが承認を追加した場合に正しい順序で追加されていることを確認するために含まれています。 UseRouting``UseAuthentication UseAuthorization 、、、および は UseEndpoints 、前のコードに示されている順序で呼び出す必要があります。

と の詳細については IdentityOptions 、「 および アプリケーション Startup の起動 IdentityOptionsを参照してください

スキャフォールディング レジスタ、ログイン、ログアウト、RegisterConfirmation

Register、、、 Login および LogOut ファイルを追加 RegisterConfirmation します。 承認手順 を使用してプロジェクトに ID Razor を スキャフォールディングし、このセクションに示すコードを生成します。

レジスタの確認

ユーザーがページの [ 登録 ] ボタンをクリックすると、 Register RegisterModel.OnPostAsync アクションが呼び出されます。 ユーザーは、オブジェクトに対して Createasync によって作成され _userManager ます。

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();
}

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

既定のテンプレートでは、ユーザーは にリダイレクトされ、アカウントを確認するリンク Account.RegisterConfirmation を選択できます。 既定値は Account.RegisterConfirmation テスト にのみ 使用されます。実稼働アプリではアカウントの自動検証を無効にする必要があります。

確認済みアカウントを要求し、登録時に即時ログインを防ぐには DisplayConfirmAccountLink = false 、/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();
    }
}

ログイン

ログインフォームは次の場合に表示されます。

  • ログイン リンクが選択されています。
  • ユーザーがアクセスを承認されていない、 または システムによって認証されていない制限付きページにアクセスしようとしています。

ログインページのフォームが送信されると、 OnPostAsync アクションが呼び出されます。 PasswordSignInAsync は、オブジェクトで呼び出され _signInManager ます。

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 での承認の概要

ログアウト

[ ログアウト すると、アクションが呼び出され LogoutModel.OnPost ます。

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 が更新されるように、コードをリダイレクトにする必要があります。

署名 は、に格納されているユーザーの要求をクリア cookie します。

Post は Pages/Shared/_LoginPartial に指定されています。

@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 Identity

既定の web プロジェクトテンプレートでは、ホームページへの匿名アクセスが許可されます。 テストするには Identity 、次のように追加し [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()
        {
        }
    }
}

サインインしている場合は、サインアウトします。アプリを実行し、リンクを選択し Privacy ます。 ログイン ページにリダイレクトされます。

Tsm Identity

詳細については Identity 、次の手順を参照してください。

Identity コンポーネント

依存する Identity NuGet パッケージはすべて、ASP.NET Core 共有フレームワーク に含まれています

のプライマリ パッケージ Identity はMicrosoft.AspNetCore Identity です。 このパッケージには、 のコア インターフェイス セットが含まれており ASP.NET Core Identity 、 によって含まれています Microsoft.AspNetCore.Identity.EntityFrameworkCore

への移行 ASP.NET Core Identity

既存のストアの移行に関する詳細とガイダンスについては、「Migrate Authentication and 」を Identity 参照 Identity してください

パスワードの強度の設定

パスワード の最小 要件を設定するサンプルについては、「構成」を参照してください。

AddDefault Identity と AddIdentity

AddDefaultIdentity は、ASP.NET Core 2.1 で導入されました。 の呼 AddDefaultIdentity び出しは、次の呼び出しに似ています。

詳細については 、AddDefault Identity ソースに関 するページを参照してください。

静的アセットの発行を防止 Identity する

静的アセット (UI 用のスタイルシートと JavaScript ファイル) が Web ルートに発行されるのを防ぐには、次のプロパティとターゲットをアプリのプロジェクト ファイル Identity Identity ResolveStaticWebAssetsInputsDependsOn RemoveIdentityAssets に追加します。

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

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

次の手順

作成者: Rick Anderson

ASP.NET Core Identity は、Core アプリにログイン機能を追加 ASP.NET システムです。 ユーザーは、 に格納されているログイン情報を持つアカウントを作成するか、 Identity 外部ログイン プロバイダーを使用できます。 サポートされている外部ログインプロバイダーには、 Facebook、Google、Microsoft アカウント、Twitterがあります。

Identity SQL Server データベースを使用して、ユーザー名、パスワード、およびプロファイルデータを格納するように構成できます。 別の永続ストアを使用することもできます (たとえば、Azure Table Storage)。

サンプルコードを表示またはダウンロード します (ダウンロード方法)。

このトピックでは、を使用し Identity てユーザーを登録、ログイン、ログアウトする方法について説明します。 を使用するアプリを作成する方法の詳細については Identity 、この記事の最後にある「次のステップ」を参照してください。

AddDefault Identity と AddIdentity

AddDefaultIdentity は ASP.NET Core 2.1 で導入されました。 AddDefaultIdentityの呼び出しは、次の呼び出しに似ています。

詳細については、「 Adddefault Identity source 」を参照してください。

認証を使用して Web アプリを作成する

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

  • [ファイル] [新しいプロジェクト] を選択し > > ます。
  • [ASP.NET Core Web アプリケーション] を選択します。 プロジェクトに WebApp1 という名前を付け、プロジェクトのダウンロードと同じ名前空間にします。 [OK] をクリックします。
  • ASP.NET Core Web アプリケーション を選択し、[ 認証の変更] を選択します。
  • 個々のユーザーアカウント を選択し、[ OK] をクリックします。

生成されたプロジェクトは ASP.NET Core Identity Razor クラスライブラリとしてを提供します。 Identity Razor クラスライブラリは、領域と共にエンドポイントを公開し Identity ます。 次に例を示します。

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

移行を適用する

移行を適用してデータベースを初期化します。

次のコマンドを、パッケージ マネージャー コンソール (PMC) で実行します。

Update-Database

登録とログインのテスト

アプリを実行し、ユーザーを登録します。 画面のサイズによっては、ナビゲーショントグル ボタンを選択して [登録] リンクと [ログイン] リンクを表示 する 必要がある場合 があります。

データベースを表示 Identity する

  • [表示] メニュー[SQL Server オブジェクト エクスプローラー (SSOX) を選択します。
  • (localdb)MSSQLLocalDB(SQL Server 13) に移動します。 dbo を右 クリックします。AspNetUsers > View Data:

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

サービスを Identity 構成する

サービスは に追加されます ConfigureServices 。 一般的なパターンは、すべての Add{Service} メソッドを呼び出した後、すべての services.Configure{Service} メソッドを呼び出すことです。

前のコードは、既定の Identity オプション値を使用して を構成します。 サービスは、依存関係の挿入 によってアプリ で使用できます

Identity は 、UseAuthentication を呼び出すことによって有効になりますUseAuthentication は、要求 パイプライン に認証ミドルウェアを追加します。

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 と「アプリケーションの起動を参照してください

スキャフォールディング レジスタ、ログイン、およびログアウト

承認手順 を使用してプロジェクトに ID Razor を スキャフォールディングし、このセクションに示すコードを生成します。

Register、Login、LogOut ファイルを追加します。

レジスタの確認

ユーザーが [ 登録 ] リンクをクリックすると、 RegisterModel.OnPostAsync アクションが呼び出されます。 ユーザーは、オブジェクトに対して Createasync によって作成され _userManager ます。

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 ます。

注: 登録時にすぐにログインできないようにする手順については、「 アカウントの確認 」をご覧ください。

ログイン

ログインフォームは次の場合に表示されます。

  • ログイン リンクが選択されています。
  • ユーザーがアクセスを承認されていない、 または システムによって認証されていない制限付きページにアクセスしようとしています。

ログインページのフォームが送信されると、 OnPostAsync アクションが呼び出されます。 PasswordSignInAsync は、オブジェクトで呼び出され _signInManager ます。

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 での承認の概要

ログアウト

[ ログアウト すると、アクションが呼び出され LogoutModel.OnPost ます。

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 します。

Post は Pages/Shared/_LoginPartial に指定されています。

@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 Identity

既定の web プロジェクトテンプレートでは、ホームページへの匿名アクセスが許可されます。 をテストするには Identity 、を [Authorize] ページに追加 Privacy します。

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

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

サインインしている場合は、サインアウトします。アプリを実行し、リンクを選択し Privacy ます。 ログイン ページにリダイレクトされます。

探索 Identity

詳細については Identity 、次の手順を参照してください。

Identity コンポーネント

依存する Identity NuGet パッケージはすべて、 メタパッケージ に Microsoft.AspNetCore.App されます

のプライマリ パッケージ Identity はMicrosoft.AspNetCore Identity です。 このパッケージには、 のコア インターフェイス セットが含まれており ASP.NET Core Identity 、 によって含まれています Microsoft.AspNetCore.Identity.EntityFrameworkCore

への移行 ASP.NET Core Identity

既存のストアの移行に関する詳細とガイダンスについては、「Migrate Authentication and 」を Identity 参照 Identity してください

パスワードの強度の設定

パスワード の最小 要件を設定するサンプルについては、「構成」を参照してください。

次の手順