ASP.NET Core Identityの使用

IdentityServerは柔軟性を重視して設計されているため、ユーザーやデータ(パスワードを含む)に必要なデータベースを使用できます。新しいユーザーデータベースを使用する場合は、ASP.NET IDを選択することができます。このクイックスタートでは、IdentityServerでASP.NET IDを使用する方法を示します。

このクイックスタートは、以前のクイックスタートをすべて完了したことを前提としています。このクイックスタートでASP.NETアイデンティティを使用するアプローチは、Visual StudioのASP.NETアイデンティティテンプレートから新しいプロジェクトを作成することです。この新しいプロジェクトは、以前のクイックスタートで作成した以前のIdentityServerプロジェクトに代わるものです。このソリューションの他のプロジェクト(クライアントとAPI用)はすべて同じままです。

ASP.NETアイデンティティのための新しいプロジェクト

まず、ASP.NET Identity用の新しいプロジェクトをソリューションに追加します。ASP.NET IDには多くのコードが必要なので、Visual Studioのテンプレートを使用するのが理にかなっています。最終的にIdentityServerの古いプロジェクトを削除します(他のクイックスタートに従っていると仮定します)。ただし、移行する必要がある項目がいくつかあります(以前のクイックスタートで説明したように、

新しい "ASP.NETコアWebアプリケーション"プロジェクトを作成します。

../_images/6_new_web_project.png

次に、 "Webアプリケーションテンプレート(Model-View-Controller)"オプションを選択します。

../_images/6_web_app_template.png

その後、 "Change Authentication"ボタンをクリックし、 "Individual User Accounts"(ASP.NET IDを使用することを意味します)を選択します:

../_images/6_change_authentication.png

最後に、新しいプロジェクトダイアログは次のようになります。それが終わったら、「OK」をクリックしてプロジェクトを作成します。

../_images/6_web_app_template_with_aspnet_identity.png

ホスティングの変更

ポート5000で実行するようにホスティングを変更することを忘れないでください(これはここで説明します)。これは既存のクライアントとapiプロジェクトが引き続き機能するように重要です。

IdentityServerパッケージを追加する

IdentityServer4.AspNetIdentityNuGetパッケージを追加します。これはIdentityServer4パッケージに依存するため、自動的に推移的な依存関係として追加されます。

../_images/6_nuget.png

スコープとクライアントの設定

これがIdentityServerの新しいプロジェクトであるにもかかわらず、従来のクイックスタートと同じスコープとクライアント構成が必要です。以前のクイックスタートで使用した構成クラス(Config.cs内)をこの新しいプロジェクトにコピーします。

(今のところ)必要な設定への変更の1つは、MVCクライアントの同意を無効にすることです。以前のIdentityServerプロジェクトの同意コードをまだコピーしていないので、今度はこれをMVCクライアントに変更して設定しRequireConsent=falseます。

new Client
{
    ClientId = "mvc",
    ClientName = "MVC Client",
    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

    RequireConsent = false,

    ClientSecrets =
    {
        new Secret("secret".Sha256())
    },

    RedirectUris           = { "http://localhost:5002/signin-oidc" },
    PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },

    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        "api1"
    },
    AllowOfflineAccess = true
}

IdentityServerの設定

前と同じように、IdentityServer はStartup.csConfigureServicesとの両方で設定する必要があります。Configure

ConfigureServices

これは、ASP.NET IDのために生成されたテンプレートコードと、IdentityServerに必要な追加(最後に)の両方を示しています。以前のクイックスタートでは、AddTestUsers拡張メソッドを使用してユーザーを登録しましたが、この状況では、AddAspNetIdentity代わりにASP.NET IDユーザーを使用するように拡張メソッドを置き換えています。AddAspNetIdentity拡張メソッドは、あなたのASP.NETアイデンティティユーザタイプ(に必要なものと同じである一般的なパラメータが必要ですAddIdentityテンプレートからの方法を)。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

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

    // Add application services.
    services.AddTransient<IEmailSender, EmailSender>();

    services.AddMvc();

    // configure identity server with in-memory stores, keys, clients and scopes
    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryPersistedGrants()
        .AddInMemoryIdentityResources(Config.GetIdentityResources())
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients())
        .AddAspNetIdentity<ApplicationUser>();
}

注釈

IdentityServerがASP.NET IDの一部の設定を上書きしているため、ASP.NET IDを使用する場合、IdentityServerがDIシステムに ASP.NET IDの後に登録されることが重要です。

設定

これには、ASP.NET ID用に生成されたテンプレートコードと、その呼び出しをUseIdentityServer置き換える呼び出しの両方が表示されますUseAuthentication。

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

    app.UseStaticFiles();

    // app.UseAuthentication(); // not needed, since UseIdentityServer adds the authentication middleware
    app.UseIdentityServer();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

ユーザデータベースの作成

これが新しいASP.NET IDプロジェクトであることを考えると、データベースを作成する必要があります。これを行うには、プロジェクトディレクトリからコマンドプロンプトを実行し、次のように実行します。dotnet ef database update -c ApplicationDbContext

../_images/6_ef_database_update.png

ユーザの作成

この時点で、プロジェクトを実行し、データベースにユーザーを作成/登録することができます。アプリケーションを起動し、ホームページから「登録」リンクをクリックしてください:

../_images/6_home_page.png

そして、登録ページで新しいユーザーアカウントを作成します:

../_images/6_register_page.png

ユーザーアカウントがあるので、ログインし、クライアントを使用し、APIを呼び出すことができるはずです。

MVCクライアントを使用したログイン

MVCクライアントアプリケーションを起動すると、「安全な」リンクをクリックしてログインすることができるはずです。

../_images/6_mvc_client.png

ASP.NET IDログインページにリダイレクトする必要があります。新しく作成されたユーザーとのログイン:

../_images/6_login.png

ログイン後、承諾ページをスキップして(上記の変更が加えられた場合)、ユーザーのクレームを記載するMVCクライアントアプリケーションにすぐにリダイレクトされます。

../_images/6_claims.png

ユーザーに代わってAPIを呼び出すには、「アプリケーションIDを使用してAPIを呼び出す」をクリックすることもできます。

../_images/6_api_claims.png

そして、あなたはASP.NET Identityからのユーザでログインしました。

次は何ですか?

IdentityServerの以前のクイックスタートプロジェクトでは、同意ページ、エラーページ、およびログアウトページが提供されていました。これらの欠けている部分のコードは、以前のクイックスタートプロジェクトからこれにコピーすることができます。これを済ませたら、最終的に古いIdentityServerプロジェクトを削除/削除できます。また、これを済ませたらRequireConsent=true、MVCクライアント設定でフラグを再度有効にすることを忘れないでください。

このクイックスタートのサンプルコードは既にこれらの手順を完了しているため、これらの機能をすべて使い始めることができます。楽しい!