ASP.NET アプリ間での認証の共有 cookieShare authentication cookies among ASP.NET apps

作成者: Rick AndersonBy Rick Anderson

多くの場合、web サイトは、連携して動作する個々の web アプリで構成されます。Websites often consist of individual web apps working together. シングルサインオン (SSO) エクスペリエンスを提供するには、サイト内の web アプリで認証を共有する必要があり cookie ます。To provide a single sign-on (SSO) experience, web apps within a site must share authentication cookies. このシナリオをサポートするために、データ保護スタックは Katana cookie 認証と ASP.NET Core 認証チケットを共有できるようにし cookie ます。To support this scenario, the data protection stack allows sharing Katana cookie authentication and ASP.NET Core cookie authentication tickets.

次の例を参照してください。In the examples that follow:

  • 認証 cookie 名は、共通の値に設定され .AspNet.SharedCookie ます。The authentication cookie name is set to a common value of .AspNet.SharedCookie.
  • AuthenticationTypeは、 Identity.Application 明示的にまたは既定でに設定されます。The AuthenticationType is set to Identity.Application either explicitly or by default.
  • 共通のアプリ名は、データ保護システムがデータ保護キー () を共有できるようにするために使用され SharedCookieApp ます。A common app name is used to enable the data protection system to share data protection keys (SharedCookieApp).
  • Identity.Application は、認証スキームとして使用されます。Identity.Application is used as the authentication scheme. どのようなスキームを使用する場合でも、既定のスキームとして、または明示的に設定することによって、共有アプリ 内および 共有アプリ全体で一貫して使用する必要があり cookie ます。Whatever scheme is used, it must be used consistently within and across the shared cookie apps either as the default scheme or by explicitly setting it. スキームは、の暗号化と復号化に使用される cookie ため、一貫したスキームをアプリ間で使用する必要があります。The scheme is used when encrypting and decrypting cookies, so a consistent scheme must be used across apps.
  • 一般的な データ保護キー の保存場所が使用されます。A common data protection key storage location is used.
  • DataProtectionProvider には、 AspNetCore NuGet パッケージが必要です。DataProtectionProvider requires the Microsoft.AspNetCore.DataProtection.Extensions NuGet package:
  • SetApplicationName 共通アプリ名を設定します。SetApplicationName sets the common app name.

認証を共有する cookieASP.NET Core IdentityShare authentication cookies with ASP.NET Core Identity

ASP.NET Core Identity を使うとき:When using ASP.NET Core Identity:

  • データ保護キーとアプリ名は、アプリ間で共有する必要があります。Data protection keys and the app name must be shared among apps. 共通のキー格納場所は、次の例のメソッドに提供され PersistKeysToFileSystem ます。A common key storage location is provided to the PersistKeysToFileSystem method in the following examples. SetApplicationName共通の共有アプリ名を構成するには、を使用し SharedCookieApp ます (次の例を参考にしてください)。Use SetApplicationName to configure a common shared app name (SharedCookieApp in the following examples). 詳細については、「ASP.NET Core データ保護の構成」を参照してください。For more information, see ASP.NET Core データ保護の構成.
  • 拡張メソッドを使用して、 ConfigureApplicationCookie のデータ保護サービスを設定し cookie ます。Use the ConfigureApplicationCookie extension method to set up the data protection service for cookies.
  • 既定の認証の種類はです Identity.ApplicationThe default authentication type is Identity.Application.

Startup.ConfigureServicesの場合:In Startup.ConfigureServices:

services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
});

認証を共有 cookie しない ASP.NET Core IdentityShare authentication cookies without ASP.NET Core Identity

を使用せずにを直接使用する場合 cookie ASP.NET Core Identity は、でデータ保護と認証を構成し Startup.ConfigureServices ます。When using cookies directly without ASP.NET Core Identity, configure data protection and authentication in Startup.ConfigureServices. 次の例では、認証の種類がに設定されてい Identity.Application ます。In the following example, the authentication type is set to Identity.Application:

services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.AddAuthentication("Identity.Application")
    .AddCookie("Identity.Application", options =>
    {
        options.Cookie.Name = ".AspNet.SharedCookie";
    });

cookie異なるベースパス間で s を共有するShare cookies across different base paths

認証では、 cookie 既定値としてHttpRequestが使用されます Cookie 。パスAn authentication cookie uses the HttpRequest.PathBase as its default Cookie.Path. アプリの cookie を異なる基本パスで共有する必要がある場合は、を Path オーバーライドする必要があります。If the app's cookie must be shared across different base paths, Path must be overridden:

services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
    options.Cookie.Path = "/";
});

サブ cookie ドメイン間で s を共有するShare cookies across subdomains

をサブドメイン間で共有するアプリをホストする場合は cookie 、で共通のドメインを指定し Cookie ます。ドメインプロパティ。When hosting apps that share cookies across subdomains, specify a common domain in the Cookie.Domain property. やなどのでアプリ間で s を共有するには、をとし cookie contoso.com first_subdomain.contoso.com second_subdomain.contoso.com て指定し Cookie.Domain .contoso.com ます。To share cookies across apps at contoso.com, such as first_subdomain.contoso.com and second_subdomain.contoso.com, specify the Cookie.Domain as .contoso.com:

options.Cookie.Domain = ".contoso.com";

保存時のデータ保護キーの暗号化Encrypt data protection keys at rest

運用環境のデプロイの場合は、 DataProtectionProvider DPAPI または X509Certificate を使用して保存時のキーを暗号化するようにを構成します。For production deployments, configure the DataProtectionProvider to encrypt keys at rest with DPAPI or an X509Certificate. 詳細については、「ASP.NET Core を使用した Windows および Azure での保存時のキーの暗号化」を参照してください。For more information, see ASP.NET Core を使用した Windows および Azure での保存時のキーの暗号化. 次の例では、証明書の拇印がに提供されてい ProtectKeysWithCertificate ます。In the following example, a certificate thumbprint is provided to ProtectKeysWithCertificate:

services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");

cookieASP.NET 4.x と ASP.NET Core アプリの間で認証を共有するShare authentication cookies between ASP.NET 4.x and ASP.NET Core apps

Katana 認証ミドルウェアを使用する ASP.NET 4.x アプリは Cookie cookie 、ASP.NET Core 認証ミドルウェアと互換性のある認証を生成するように構成できます Cookie 。ASP.NET 4.x apps that use Katana Cookie Authentication Middleware can be configured to generate authentication cookies that are compatible with the ASP.NET Core Cookie Authentication Middleware. これにより、複数の手順で大規模なサイトの個々のアプリをアップグレードしながら、サイト全体でスムーズに SSO を利用することができます。This allows upgrading a large site's individual apps in several steps while providing a smooth SSO experience across the site.

アプリで Katana Cookie 認証ミドルウェアを使用すると、 UseCookieAuthentication プロジェクトの Startup.Auth.cs ファイルでが呼び出されます。When an app uses Katana Cookie Authentication Middleware, it calls UseCookieAuthentication in the project's Startup.Auth.cs file. Visual Studio 2013 以降で作成された ASP.NET 4.x web アプリプロジェクトは、既定で Katana 認証ミドルウェアを使用します Cookie 。ASP.NET 4.x web app projects created with Visual Studio 2013 and later use the Katana Cookie Authentication Middleware by default. UseCookieAuthenticationは互換性のために残されており、ASP.NET Core アプリではサポートされていませんが、 UseCookieAuthentication Katana 認証ミドルウェアを使用する ASP.NET 4.x アプリでを呼び出すこと Cookie は有効です。Although UseCookieAuthentication is obsolete and unsupported for ASP.NET Core apps, calling UseCookieAuthentication in an ASP.NET 4.x app that uses Katana Cookie Authentication Middleware is valid.

ASP.NET 4.x アプリは .NET Framework 4.5.1 以降を対象にする必要があります。An ASP.NET 4.x app must target .NET Framework 4.5.1 or later. そうしないと、必要な NuGet パッケージのインストールに失敗します。Otherwise, the necessary NuGet packages fail to install.

cookieASP.NET 4.x アプリと ASP.NET Core アプリの間で認証を共有するには、「 cookie ASP.NET Core アプリ間での共有認証」セクションの説明に従って ASP.NET Core アプリを構成し、次のように ASP.NET 4.x アプリを構成します。To share authentication cookies between an ASP.NET 4.x app and an ASP.NET Core app, configure the ASP.NET Core app as stated in the Share authentication cookies among ASP.NET Core apps section, then configure the ASP.NET 4.x app as follows.

アプリのパッケージが最新リリースに更新されていることを確認します。Confirm that the app's packages are updated to the latest releases. それぞれの ASP.NET 4.x アプリに Owin パッケージをインストールします。Install the Microsoft.Owin.Security.Interop package into each ASP.NET 4.x app.

の呼び出しを見つけて変更し UseCookieAuthentication ます。Locate and modify the call to UseCookieAuthentication:

  • cookieASP.NET Core 認証ミドルウェアによって使用される名前 (例では) に合わせて名前を変更 Cookie .AspNet.SharedCookie します。Change the cookie name to match the name used by the ASP.NET Core Cookie Authentication Middleware (.AspNet.SharedCookie in the example).
  • 次の例では、認証の種類がに設定されて Identity.Application います。In the following example, the authentication type is set to Identity.Application.
  • DataProtectionProviderCommon data protection キーの格納場所に初期化されたのインスタンスを提供します。Provide an instance of a DataProtectionProvider initialized to the common data protection key storage location.
  • アプリケーション名が、認証を共有するすべてのアプリ (例では) によって使用される共通のアプリ名に設定されていることを確認し cookie SharedCookieApp ます。Confirm that the app name is set to the common app name used by all apps that share authentication cookies (SharedCookieApp in the example).

およびを設定していない場合は http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityproviderUniqueClaimTypeIdentifier 一意のユーザーを識別するクレームをに設定します。If not setting http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier and http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider, set UniqueClaimTypeIdentifier to a claim that distinguishes unique users.

App_Start/startup.auth.cs :App_Start/Startup.Auth.cs :

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "Identity.Application",
    CookieName = ".AspNet.SharedCookie",
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity =
            SecurityStampValidator
                .OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) =>
                        user.GenerateUserIdentityAsync(manager))
    },
    TicketDataFormat = new AspNetTicketDataFormat(
        new DataProtectorShim(
            DataProtectionProvider.Create("{PATH TO COMMON KEY RING FOLDER}",
                (builder) => { builder.SetApplicationName("SharedCookieApp"); })
            .CreateProtector(
                "Microsoft.AspNetCore.Authentication.Cookies." +
                    "CookieAuthenticationMiddleware",
                "Identity.Application",
                "v2"))),
    CookieManager = new ChunkingCookieManager()
});

System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier =
    "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name";

ユーザー id を生成するときは、認証の種類 ( Identity.Application ) が AuthenticationType UseCookieAuthentication App_Start/startup.auth.cs ので設定されたで定義されている種類と一致している必要があります。When generating a user identity, the authentication type (Identity.Application) must match the type defined in AuthenticationType set with UseCookieAuthentication in App_Start/Startup.Auth.cs .

モデル/ IdentityModels.cs :Models/IdentityModels.cs :

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(
        UserManager<ApplicationUser> manager)
    {
        // The authenticationType must match the one defined in 
        // CookieAuthenticationOptions.AuthenticationType
        var userIdentity = 
            await manager.CreateIdentityAsync(this, "Identity.Application");

        // Add custom user claims here

        return userIdentity;
    }
}

共通のユーザーデータベースを使用するUse a common user database

アプリで同じ Identity スキーマ (同じバージョンの) が使用されている場合は Identity 、 Identity 各アプリのシステムが同じユーザーデータベースを指していることを確認します。When apps use the same Identity schema (same version of Identity), confirm that the Identity system for each app is pointed at the same user database. それ以外の場合、id システムは、認証の情報をデータベース内の情報と照合しようとしたときに、実行時にエラーを生成し cookie ます。Otherwise, the identity system produces failures at runtime when it attempts to match the information in the authentication cookie against the information in its database.

アプリ Identity 間でスキーマが異なる場合、通常はアプリで異なるバージョンが使用されているため Identity 、最新バージョンのに基づいて共通データベースを共有する Identity ことはできません。他のアプリのスキーマに再マップして列を追加する必要はありません Identity 。When the Identity schema is different among apps, usually because apps are using different Identity versions, sharing a common database based on the latest version of Identity isn't possible without remapping and adding columns in other app's Identity schemas. 多くの場合、アプリで共通のデータベースを共有できるように、他のアプリをアップグレードして最新バージョンを使用する方が効率的です Identity 。It's often more efficient to upgrade the other apps to use the latest Identity version so that a common database can be shared by the apps.

その他のリソースAdditional resources