現在、デフォルトのクライアントIDとシークレットを備えた外部ログインプロバイダーを備えたIdentity Server 4 Webアプリケーションを作成しています。しかし、私の目標は、テナントに基づいてAzure、Google、Facebookなどの認証プロバイダーを登録することです。
私はSaasKitマルチテナンシーアセンブリを使用しましたが、ここではapp.usepertenant()ミドルウェアを試しました。しかしseGoogleAuthentication()メソッドは廃止されているため、このusepertenantミドルウェアを使用してマルチテナント認証を実現できませんでした。
現在のコード、
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddMicrosoftAccount(option =>
{
option.ClientId = "clientid";
option.ClientSecret = "clientsecret";
option.SaveTokens = true;
});
期待されるコードは以下のようです、
var authentication = services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme);
if (tenant.hasMicrosoft)
{
authentication.AddMicrosoftAccount(option =>
{
option.ClientId = "clientid";
option.ClientSecret = "clientsecret";
option.SaveTokens = true;
});
}
if (tenant.hasGoogle)
{
authentication.AddGoogle(option =>
{
option.ClientId = "clientid";
option.ClientSecret = "clientsecret";
option.SaveTokens = true;
});
}
authentication.AddCookie( options =>
{
options.SlidingExpiration = true;
options.ExpireTimeSpan = new TimeSpan(7, 0, 0, 0);
});
複数の認証プロバイダーのサポートを追加したいですか? このドキュメント 構成サービスに複数の認証プロバイダーを追加する方法はすでに指定されています。自分でパイプラインを構成するためにapp.UseXXX
を使用する必要はもうありません
認証はDI登録時に構成する必要があるため、認証の登録時に一般にすべての外部ログインプロバイダーをセットアップする必要があります。
そのステップでは、すべてのスキームを追加する必要があります。スキームには固定のクライアントID /シークレットがあるため、すべてのクライアントに対してサポートする、すべての外部ログインプロバイダー資格情報を含むIdentityServerをbootstrapする必要があります。スキーム名は一意である必要があります。 。
例として、テナントAにはスキーム「A_Microsoft」があり、テナントBにはスキーム「B_Microsoft」がある、などです。
その後、IdentityServerでメソッドを呼び出すときに、これらの認証スキームを参照できます。サインイン、チャレンジ、サインアウトなど。
これには、IdentityServerの完全なテナントセットをブートストラップする必要があることに注意してください。シナリオによっては、テナントが定期的に更新される場合、新しい認証スキームを認識するためにIdentityServerを定期的に再起動する必要もあります。
それが問題である場合、IdentityServerの実行時に登録された認証スキームを何らかの方法で増強することができますが、簡単ではありません。 AspNetCoreに付属する認証ミドルウェアの大規模なカスタム実装が必要になる場合があります。