none
ASP.NET Core MVCで、ログイン時にそのユーザに合わせたDB接続文字列を取得したい RRS feed

  • 質問

  • ASP.NET Core MVCでWebアプリケーションを開発しています。
    AD認証が必要で、サインインしたユーザに基づき接続先のDBのインスタンスあるいはスキーマを切り替える必要があります。
    どう実装したらいいのか悩んでおり、皆様のご意見をお聞かせ願いたいです。

    いわゆるマルチテナント的な構成で、各ユーザは必ず1つのテナントに属しています。
    テナントに1:1で対応するDBインスタンス(あるいはスキーマでも可)があり、ログインするとそのユーザが属するテナントのデータソースにアクセスできます。

    これを実現するために、どこかにユーザあるいはテナント(=グループ)と対応するDB接続文字列を保持させ、ログイン時に取得しようと思いました。

    実装方法として以下などを考えたのですが、メリット・デメリットや実装の難しさが判断できず、悩んでいる状況です。
    万が一にも、別のテナントのデータが参照できてはいけないので、複雑な運用は避けたいと思っています。

    (1)ADユーザに接続文字列を持たせる?
    ・どうやって持たせる?カスタム属性?
    ・認証時に情報が取得できるのか?
    ・テナントに属するユーザ数が増えたら面倒では?

    (2)ADグループに接続文字列を持たせる
    ・テナントに相当するグループを作ったとして、どうやってユーザからグループをたどる?
    ・(1)同様、どうやって接続文字列の保存・取得をする?

    (3)テナントごとの接続文字列をDBやKVSなどで管理する
    ・キーは何?ADユーザやADグループのGUID?

    皆様ならどう実装されますか?
    ご意見いただけますと幸いです。

    よろしくお願いします。

    なお、利用技術は以下の通りです。
    Web:Windows Server 2012 R2, IIS7, ASP.NET Core MVC, .NET 4.6.2, C#
    DB:Windows Server 2012 R2, SQL Server 2016 Standard, Entity Framework Core
    AD:Windows Server 2012 R2, ADDS

    2016年9月5日 13:39

回答

  • 接続文字列が「テナント(グループ)毎に一意」で、テナント毎に接続URL(パス)が独立していて、テナントの数が十分少ないのであれば、例えばWebアプリケーションをテナント毎に個別の物理フォルダーに配置して、それぞれの構成ファイルで接続文字列を指定するのが簡単そうに思います。

    テナントの数が多いとか、接続URLが全てのテナントで共通の場合は、認証情報と接続文字列の対応付けを管理するためのデータベースを用意すると思います。(ASP.NET Identityを拡張するか、独自のテーブルを用意するかは要件次第です。)

    ご質問には「AD認証が必要」とありますが、現行のASP.NET Core MVCでは社内設置のADで認証を行う方法が限られています。組み込みで用意されているのは(今のところ)IISのWindows認証を使う方法だけだと思いますので、インターネットでは採用しにくいです。私なら、社内用のシステムでない限りは、なるべくADを避ける方向で考えます。
    (ADに情報を格納したいということでしたら、.NET Framework 4.6.2のSystem.DirectoryServices.AccountManagementを使うことになるかと思います。私は試したことはありません。)


    ご参考になれば幸いです。

    • 回答としてマーク sekikatsu36 2016年9月7日 13:59
    2016年9月6日 22:46

すべての返信

  • 接続文字列が「テナント(グループ)毎に一意」で、テナント毎に接続URL(パス)が独立していて、テナントの数が十分少ないのであれば、例えばWebアプリケーションをテナント毎に個別の物理フォルダーに配置して、それぞれの構成ファイルで接続文字列を指定するのが簡単そうに思います。

    テナントの数が多いとか、接続URLが全てのテナントで共通の場合は、認証情報と接続文字列の対応付けを管理するためのデータベースを用意すると思います。(ASP.NET Identityを拡張するか、独自のテーブルを用意するかは要件次第です。)

    ご質問には「AD認証が必要」とありますが、現行のASP.NET Core MVCでは社内設置のADで認証を行う方法が限られています。組み込みで用意されているのは(今のところ)IISのWindows認証を使う方法だけだと思いますので、インターネットでは採用しにくいです。私なら、社内用のシステムでない限りは、なるべくADを避ける方向で考えます。
    (ADに情報を格納したいということでしたら、.NET Framework 4.6.2のSystem.DirectoryServices.AccountManagementを使うことになるかと思います。私は試したことはありません。)


    ご参考になれば幸いです。

    • 回答としてマーク sekikatsu36 2016年9月7日 13:59
    2016年9月6日 22:46
  • ご回答ありがとうございます!

    テナント数は少ないのですが、URLは一意にしたいので、データベースを用意して独自のテーブルを用意する方針にしたいと思います。

    ASP.NET Core MVCは社内AD認証に限定されていることは、把握していませんでした。。。
    今回のケースはインターネットで外部に公開するものではないので、運よく問題はなさそうですが、ご指摘いただきありがとうございます。
    ASP.NET Coreはまだまだ癖がありそうですね・・・

    System.DirectorySerivces.DirectoryEntryなどを使ってログインユーザの所属グループ(or OU)のGUIDを取得して、それをキーに用意したデータベースから接続文字列を特定する方式にしようと思います。

    重ねて、ご回答いただきありがとうございました!

    2016年9月7日 13:59