アプリドメイン間で認証されたセッションを渡すにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/72125

質問

Web サイト www.xyz.com と www.abc.com があるとします。

ユーザーが www.abc.com にアクセスし、通常の ASP .NET メンバーシップ プロバイダーを通じて認証されたとします。

次に、そのサイトから、ユーザーは (リダイレクト、リンクなど、機能するものは何でも) サイト www.xyz.com に送信されます。サイト www.abc.com の目的は、そのユーザーを isAuthenticated のステータスとして他のサイトに渡すことでした。これにより、サイト www.xyz.com が当該ユーザーの資格情報を再度要求することがなくなります。

これが機能するには何が必要でしょうか?ただし、これにはいくつかの制約があります。ユーザー データベースは完全に分離されており、組織の内部にあるものではありません。あらゆる点で、認証済みとして stackoverflow.com から Google に渡すようなもので、本質的に分離されています。関連記事へのリンクで十分です。

役に立ちましたか?

解決

web.config 認証セクションを次のように設定して、FormAuthentication を使用してみてください。

<authentication mode="Forms">
  <forms name=".ASPXAUTH" requireSSL="true" 
      protection="All" 
      enableCrossAppRedirects="true" />
</authentication>

マシンキーを生成します。例: MachineKey を生成する最も簡単な方法 – ヒントとテクニック:ASP.NET、IIS ...

他のアプリケーションに送信するとき、認証チケットは隠しフィールドとして渡されます。最初のアプリから投稿を読み取るときに、2 番目のアプリは暗号化されたチケットを読み取り、ユーザーを認証します。フィールドをポストするページの例を次に示します。

.aspx:

<form id="form1" runat="server">
  <div>
    <p><asp:Button ID="btnTransfer" runat="server" Text="Go" PostBackUrl="http://otherapp/" /></p>
    <input id="hdnStreetCred" runat="server" type="hidden" />
  </div>
</form>

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    FormsIdentity cIdentity = Page.User.Identity as FormsIdentity;
    if (cIdentity != null)
    {
        this.hdnStreetCred.ID = FormsAuthentication.FormsCookieName;
        this.hdnStreetCred.Value = FormsAuthentication.Encrypt(((FormsIdentity)User.Identity).Ticket);
    }
}

この文書の第 5 章のクロスアプリ フォーム認証セクションも参照してください。 ロックスから。自作の SSO ソリューションを提供することに加えて、上記のような回答を推奨します。

他のヒント

組み込みのメンバーシップ システムを使用している場合は、各 web.config で次のようなものを使用することで、フォーム認証によるクロス サブドメイン認証を行うことができます。

<authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" path="/" 
                  protection="All" 
                  domain="datasharp.co.uk" 
                  enableCrossAppRedirects="true" />

</authentication>

すべての web.config で名前、パス、保護、ドメインが同じであることを確認してください。サイトが異なるマシン上にある場合は、machineKey と検証キーおよび暗号化キーが同じであることも確認する必要があります。

ユーザー セッションをデータベースに保存する場合、セッション テーブル内の GUID の存在を確認するだけで済みます。GUID が存在する場合、ユーザーはすでに他のドメインで認証されています。これを機能させるには、ユーザーを他の Web サイトにリダイレクトするときに、URL にセッション GUID を含める必要があります。

.NET に何を使用するかはわかりませんが、通常はこれを使用します memcached LAMP スタック内。

解像度は、アプリケーションの種類とそれが実行されている環境によって異なります。例えば。NT ドメインを持つイントラネットでは、NTLM を使用して、セッションを複製することなく、Windows 資格情報をイントラネット境界内のサーバーに直接渡すことができます。

これを行う方法のアプローチは一般的に次のように呼ばれます。 シングル・サインオン (見る ウィキペディア).

この問題には複数のアプローチがあり、「クロスドメイン シングル サインオン」と呼ばれます。Matej が指摘した Wikipedia の記事は、オープンソース ソリューションを探している場合に特に役立ちますが、Windows 環境では、次の 2 つのアプローチのいずれかを使用するのが最善であると思います。

  1. 商用 SSO 製品 (SiteMinder や PingIdentity など) を購入する
  2. MicroSoft のクロスドメイン SSO ソリューションを使用します。 ADFS - アクティブ ディレクトリ フェデレーション サービス。(フェデレーションとは、複数のドメインの動作を調整するための用語です)

SiteMinder を使用したことがありますが、うまく機能しますが、高価です。すべてが MicroSoft 環境にいる場合は、ADFS が最善の策だと思います。これで始めましょう ADFS ホワイトペーパー.

CAS のようなものを使用します。

[1]: http://www.ja-sig.org/products/cas/ CAS

これは解決済みの問題なので、独自の問題を作成することはお勧めしません。

あるいは、独自のサイトをロールしたいが、問題のサイトが同じサーバー上にない場合、または共有データベースにアクセスできない場合 (その場合は上記の回答を参照)、 ウェブビーコン それぞれのサイトで他のサイトを参照します。

単一のピクセル画像 (Web ビーコン) をサイト A に配置し、ユーザー ID (暗号化およびタイムスタンプ付き) を介してサイト B を呼び出します。これにより、サイト B に、ログイン済みとして設定されるユーザーの新しいユーザー セッションが作成されます。ユーザーがサイト B にアクセスすると、すでにログインしていることになります。

通話を最小限にするには、ホームページまたはログイン確認ページに Web ビーコンを配置するだけです。私は過去にこれを使用して、パートナー サイト間で情報を渡すことに成功しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top