9

www.xyz.com と www.abc.com というウェブサイトがあるとします。

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

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

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

4

8 に答える 8

5

次のように 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);
    }
}

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

于 2008-09-16T14:41:42.460 に答える
2

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

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

</authentication>

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

于 2008-09-16T13:56:05.050 に答える
1

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

于 2008-09-16T13:40:47.957 に答える
0

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

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

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

于 2008-09-16T14:10:01.537 に答える
0

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

これを行う方法は、一般にシングル サインオンと呼ばれます ( Wikipediaを参照)。

于 2008-09-16T13:39:14.887 に答える
0

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

于 2008-09-16T13:27:47.020 に答える
0

私はCASのようなものを使用します:

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

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

于 2008-09-16T14:45:19.487 に答える
-1

または、自分でロールしたいが、問題のサイトが同じサーバー上にない場合、または共有データベースにアクセスできない場合(この場合、上記の応答を参照)、各サイトにWebビーコンを配置できます。他のサイトを参照します。

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

通話を最小限に抑えるために、ホームページにWebビーコンを配置するか、確認ページにログインすることしかできませんでした。私は過去にこれをうまく使用して、パートナーサイト間で情報を渡しました。

于 2008-09-16T14:26:25.680 に答える