ASP.NET Core Identityの自習記録（.NET FrameworkCore3.0)　1日目

# この自習の目標
* MVC.NET Coreの認証無しテンプレートで作成されたWebページにASP.NET Core Identityで認証を追加する
* 保存領域として、Postgresを利用
* ユーザー情報にカスタム項目を追加する
* ユーザー情報にいろいろなRoleを追加する
* その他、ある程度業務で使うだろう範囲で、色々いじくる＆使い方を覚える

こんな感じで行こうと思っています。
当方たいした知識は無いので間違っていたら突っ込んでください・・・

###1．最低限認証が実施できる物を作成する
####1-1．素のMVC.NET Coreを作成する
※ここは説明いらないと思いますが、
VS2019で新規プロジェクト＞ASP.NET Core Webアプリケーションを選択
次の画面の設定はこんな感じ
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156596/c22581f9-a192-c73b-9cb8-b4fe293d8beb.png">
※基本的に認証付きで作成したテンプレートに近づけていく作業です。

####1-2．参照パッケージ
　Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
　Microsoft.AspNetCore.Identity.EntityFrameworkCore
　Microsoft.AspNetCore.Identity.UI
　Microsoft.EntityFrameworkCore
　Npgsql.EntityFrameworkCore.PostgreSQL
　Microsoft.EntityFrameworkCore.Tools

####1-3.DBContext追加
　TestApplicationDbContext.csを作成して、Identityのクラスを継承したEFクラスを作成

```csharp:TestApplicationDbContext.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace WebTeqKensho.Data
{
    public class TestApplicationDbContext : IdentityDbContext
    {
        public TestApplicationDbContext(DbContextOptions<TestApplicationDbContext> options)
    : base(options)
        {
        }
    }
}
```

####1-4.ログインリンクの追加
　_LoginPartial.cshtmlを作成して、ログイン用のリンクのテンプレを作成

```html:_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.Action("Index", "Home", new { area = "" })">
                <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>
```

　標準のテンプレートにログインテンプレの読み込みを追加（_Layout.cshtmlの20行目に追加）

```csharp:_Layout.cshtml
<partial name="_LoginPartial" />
```

####1-5.Startup.csの設定
　ConfigureServicesに処理を追加

```csharp:Startup.cs
        public void ConfigureServices(IServiceCollection services)
        {
            //EntityFramework接続の設定
            services.AddDbContext<TestApplicationDbContext>(options =>
                options.UseNpgsql(
                Configuration.GetConnectionString("DefaultConnection")));
            //Identityと接続を紐付ける
            services.AddDefaultIdentity<IdentityUser>()
                .AddEntityFrameworkStores<TestApplicationDbContext>();
            services.AddControllersWithViews(); //既存
        }
```

　Configureに処理を追加

```csharp:Startup.cs
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();
            app.UseAuthentication();      //認証のために追加
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                endpoints.MapRazorPages();   //認証の為のページ遷移設定の読み込み
            });
```

####1-6.接続情報をappsettings.jsonに追加

※接続情報は人それぞれなので適当に変えてください。

```json:appsettings.json
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Port=5432;User Id=tester;Password=tester;Database=testDB"
  },
```

####1-7.マイグレーションをしてDBにテーブルを追加

アップデート用ファイル作成(パッケージマネージャコンソールで実行）
>Add-Migration firstIdentity

実行
>Update-Database -Verbose

以上で最低限identityを利用して認証するための下準備が完了。
次回からは、カスタマイズを中心に調べていきますよ。