1

マルチテナンシー(MVC3、EFを使用)とカスタムSQLメンバーシッププロバイダーについて質問があります。

追加のユーザーベースの属性とともにuserIdをアプリケーションテーブルに含める必要があるため、カスタムのUserおよびRolesメンバーシップクラスを作成しました。現在、これをマルチテナンシーアプリケーションに変換しています。shared-db、shared-appモデルを使用します。テナントの詳細(URLを含む)を格納するマスターテナントテーブルがあり、Tenant_idはすべてのテーブルに含まれています。そして今、私たちはアプリケーション自体の変更に取り組んでいます。

テナントは、tenantUrl.mybaseURL.comのようなURLを使用してログインすることを前提としています。

このアルゴリズムに従って、カスタムのUserValidateメソッドを変更します。

- User goes to URL to login
- The Account controller logon method calls the Custom validate method passing in user/pwd and the tenantId (which has been looked up from the db using the URL).
- The custom validate method checks if the user/password/tenantId combination are valid. 
- If valid, we set the tenant Id in a HttpRequest Object and login the user
- For each db access, we lookup the Request object for the tenandId and use that as a filter. 

編集:これは私のTenantContextクラスであり、tenantIdを設定/取得します

public class TenantContext
{
    public static int TenantId
    {
        set
        {

            if (!HttpContext.Current.Items.Contains("tenant-code"))
                HttpContext.Current.Items.Add("tenant-code", value);

            HttpContext.Current.Items["tenant-code"] = value;
        }

        get {return HttpContext.Current.Items.Contains("tenant-code") ? Convert.ToInt32(HttpContext.Current.Items["tenant-code"]) : -1; }

    }
}

TenantIdは、上記のコンテキストのアカウントコントローラーログインで設定されます。

上記はこれを行うための良い方法ですか、それともより良い方法がありますか?誰かが私が知っておくべきこれに関する問題を見ますか?

ここでAppSettingsに格納されているtenantIdの例を見てきました。マルチテナントサイトでのデータアクセスの処理。これはそれを行うためのより良い方法ですか?

ありがとうございました

4

1 に答える 1

0

あなたのアルゴリズムは完璧で、実際、私はこの種の実装に取り​​組んできました。カスタムオブジェクトを使用して、さまざまなレイヤーでユーザーIDを維持することをお勧めします。これには、ユーザー ID、テナント ID などが含まれます。この HttpContext は、WCF サービスの場合、およびテナントに属し、別のテナントに代わって動作するユーザーのコンテキストでは役に立たないためです。したがって、ユーザーを識別する UserIdentity オブジェクトを使用することをお勧めします。また、すべての環境で利用できるわけではないため、テナント ID をデータ アクセス レイヤーに送信し、リクエストからテナント ID を推測しないでください。

于 2013-04-28T18:23:03.693 に答える