認証と Identity の ASP.NET Core への移行

作成者: Steve Smith

前の記事では、ASP.NET MVC プロジェクトから ASP.NET Core MVC へ構成を移行しました。 この記事では、登録、ログイン、ユーザー管理機能を移行します。

Identity とメンバーシップを構成する

ASP.NET MVC では、認証と identity 機能は、App_Start フォルダーにある Startup.Auth.csIdentityConfig.cs の ASP.NET Identity を使用して構成されます。 ASP.NET Core MVC では、Startup.cs でこれらの機能が構成されます。

次の NuGet パッケージをインストールします。

  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.AspNetCore.Authentication.Cookies
  • Microsoft.EntityFrameworkCore.SqlServer

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Startup.cs では、Entity Framework と Identity サービスを使用するように Startup.ConfigureServices メソッドを更新します。

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

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

     services.AddMvc();
}

この時点では、上記のコードで参照されている ApplicationDbContextApplicationUser の 2 種類がありますが、これらは ASP.NET MVC プロジェクトからはまだ移行されていません。 ASP.NET Core プロジェクトに、新しい Models フォルダーを作成して、これらの種類に対応するクラスを 2 つ追加します。 これらのクラスの ASP.NET MVC バージョンは、/Models/IdentityModels.cs で確認できますが、移行されたプロジェクトでは、明確さを期すため、1 クラスあたり 1 ファイルを使用します。

ApplicationUser.cs:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;

namespace NewMvcProject.Models
{
    public class ApplicationUser : IdentityUser
    {
    }
}

ApplicationDbContext.cs:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.Data.Entity;

namespace NewMvcProject.Models
{
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Core Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Core Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
    }
}

ASP.NET Core MVC Starter Web プロジェクトには、ユーザーのカスタマイズの多くや、ApplicationDbContext が含まれます。 実際のアプリを移行する場合は、アプリのユーザーと DbContext クラス、およびアプリで利用されている他の Model クラスの、すべてのカスタム プロパティとメソッドも移行する必要があります。 たとえば、DbContextDbSet<Album> がある場合は、Album クラスを移行する必要があります。

これらのファイルを配置すると、その using ステートメントを更新することで、Startup.cs ファイルをコンパイルできます。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

これで、アプリで認証と Identity サービスをサポートする準備が完了しました。 あとは、これらの機能をユーザーに公開する必要があるのみです。

登録とログイン ロジックを移行する

Identity サービスが、Entity Framework と SQL Server を使用して構成されたアプリとデータ アクセス用に構成されると、登録とログインのサポートをアプリに追加する準備が完了します。 移行プロセスの冒頭で、_Layout.cshtml_LoginPartial への参照をコメントアウトしたことを思い出してください。 次に、そのコードに戻り、コメント解除して、ログイン機能をサポートするために必要なコントローラーとビューを追加します。

_Layout.cshtml@Html.Partial 行のコメントを解除します。

      <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
    </ul>
    @*@Html.Partial("_LoginPartial")*@
  </div>
</div>

次に、_LoginPartial という名前の新しい Razor ビューを Views/Shared フォルダーに追加します。

_LoginPartial.cshtml を次のコードで更新します (すべての内容を置き換えます)。

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
    <form asp-area="" asp-controller="Account" asp-action="Logout" method="post" id="logoutForm" class="navbar-right">
        <ul class="nav navbar-nav navbar-right">
            <li>
                <a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
            </li>
            <li>
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
            </li>
        </ul>
    </form>
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li><a asp-area="" asp-controller="Account" asp-action="Register">Register</a></li>
        <li><a asp-area="" asp-controller="Account" asp-action="Login">Log in</a></li>
    </ul>
}

この時点で、ブラウザーでサイトを最新の情報に更新できるはずです。

まとめ

ASP.NET Core により、ASP.NET Identity 機能に変更が導入されます。 この記事では、ASP.NET Identity の認証機能とユーザー管理機能を ASP.NET Core へ移行する方法を確認しました。