3

独自の認証を使用する既存の ASP.NET アプリケーション (WebForms) があります。私たちはシングル サインオン ソリューションの実装を任されており、WIF の使用を選択しました。

アプリケーションのインスタンスを 1 つ実行し、サブドメイン (例: client1.ourapp.com、client2.ourapp.com など) を使用してクライアントを識別します。アプリケーション コードでは、クライアントを識別する最初のサブドメインを取り除きます。

私たちは WIF の概念実証に取り組み、ユーザーが認証されたら正しいサブドメインにリダイレクトする方法を見つけ出しました。すぐに使用できる動作は、STS が構成ファイルで識別されているレルムにユーザーをリダイレクトすることのようです。以下は、PoC 構成ファイルです。ホスト ファイルを使用してさまざまなクライアントを偽装しています (つまり、127.0.0.1 client1.ourapp.com、127.0.0.1 client2.ourapp.com)。

<federatedAuthentication>
    <wsFederation 
        passiveRedirectEnabled="true" 
        issuer="http://ourapp.com/SSOPOCSite_STS/" 
        realm="http://client1.ourapp.com" 
        requireHttps="false" />
</federatedAuthentication>

全員を同じサブドメインにリダイレクトすることはできないため、明らかにこれは機能しません。

これを処理する方法を理解していると思いますが、正しい方法で行っているのか、それとも運が良かっただけなのかについて、外部の意見を求めています.

FAM の RedirectingToIdentityProvider イベントのイベント ハンドラーを作成しました。その中で、リクエスト URL から会社名を取得し、会社名を使用してレルム文字列を作成し、SignInRequestMessage のレルムとホームレルムを設定してから、FAM に処理を任せます (つまり、認証のために STS にリダイレクトします)。

protected void WSFederationAuthenticationModule_RedirectingToIdentityProvider( object sender, RedirectingToIdentityProviderEventArgs e )
{
    // this method parses the HTTP_HOST and gets the first subdomain
    var companyName = GetCompanyName();
    var realm = GetRealm( companyName );

    e.SignInRequestMessage.Realm = realm;
    e.SignInRequestMessage.HomeRealm = companyName;
}

string GetRealm( string companyName )
{
    return String.Format( "http://{0}.ourapp.com/SSOPOCSite/", companyName );
}

これは問題の合理的な解決策のように思えますか?

その結果、何か問題が発生する可能性はありますか?

より良いアプローチはありますか?

4

1 に答える 1

1

あなたのソリューションは良さそうです (必要な情報を明示的に渡す)。頭に浮かぶ他の唯一のソリューションはRequest.UrlReferrer、ユーザーがどのサブドメインから来たかを判断するために使用することです。

于 2012-04-25T16:22:54.977 に答える