10

マルチテナント アプリケーションがあります。各テナントは、Facebook、Twitter、Google などで OAUTH-2 を使用してユーザーを認証できます。各テナントには、前述のサービス用の独自の API キーがあります。

OWIN パイプラインをセットアップする一般的な方法は、スタートアップで認証プロバイダーを「使用」することですが、これにより、アプリの開始時に API キーが設定されます。リクエストごとに各 oauth API で使用するキーを変更できる必要があります。

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            Provider = cookieAuthProvider,
            CookieName = "VarsityAuth",
        });

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        app.UseMicrosoftAccountAuthentication(
            clientId: "lkjhlkjkl",
            clientSecret: "kjhjkk");

テナントに基づいて、リクエストごとにこれらの設定を変更できる必要があります。これどうやってするの?

4

1 に答える 1

9

編集 - このソリューションが機能していることを確認できました。

構成に応じて、ホスト名または要求の最初のフォルダー セグメントに基づいてマルチ テナントをサポートする必要がある自分のプロジェクトについて、この問題を調査しています。

これはまだテストしていませんが、起動時に次のようなコードを実行するとうまくいくと思います。

たとえば、テナントごとに異なる auth cokie 名を使用したいのですが、起動時に次のようなコードが機能する可能性があると考えています。

// for first folder segment represents the tenant
app.Map("/branch1", app1 =>
{
    app1.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider
       {
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<SiteUserManager, SiteUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    },

        CookieName = "branch1-app"
    });

});

// for when the host name of the request identifies the tenant
app.MapWhen(IsDomain1, app2 =>
{
    app2.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        Provider = new CookieAuthenticationProvider
        {
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<SiteUserManager, SiteUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
        },

        CookieName = "domain1-app"
    });

});

private bool IsDomain1(IOwinContext context)
{
    return (context.Request.Host.Value == "domain1");
}
于 2014-10-23T18:05:49.767 に答える