Cookie をクロスドメインで共有することはできません。アプリケーションが同じドメインでホストされていない場合は、これを忘れる必要があります。ブラウザーは (明らかなセキュリティ上の理由から) Cookie をクロスドメインに送信しないため、機能しません。クロスドメイン シングル サインオンを実装する方法は他にもあります (私の回答の 2 番目の部分を参照してください)。
ここで、アプリケーションが同じドメインにあり、複数のアプリケーションがルート ドメインの異なるサブドメインに分散しているとします。
- login.foo.com
- app.foo.com
- xxx.foo.com
これらのサブドメイン間で認証を共有したいとします。domain
必要な作業は、web.configのプロパティをルート ドメインに設定するように指定することだけです。
<authentication mode="Forms">
<forms
loginUrl="https://login.foo.com"
requireSSL="true"
protection="All"
timeout="120"
domain="foo.com"
slidingExpiration="false"
name="sso" />
</authentication>
すべてのアプリケーションに同じ設定を適用する必要がありweb.config
ます。そして、それはあなたがする必要があるほとんどすべてです。サブドメインの 1 つでユーザーが認証されると、サブドメイン間で Cookie を共有できるため、他のドメインでも自動的に認証されます。
クロスドメイン シングル サインオンを実現したい場合は、別のアプローチを取る必要があります。異なるアプリケーション間で同じマシン キーを使用して、認証トークンを暗号化できます。手順は次のとおりです。
- ユーザー
https://foo.com
はこのドメインでまだ認証されていないため、ログオン画面に移動して表示されます。
- ユーザーが認証され、認証 Cookie が発行され、
foo.com
ドメインに対して有効になります。
ここで、ユーザーはhttps://bar.com
このドメインにアクセスして、自動的に認証される必要があります。あるページでhttps://foo.com
、投稿される認証 Cookie の値を含むフォームを作成できます。
<form action="https://bar.com" method="post">
<input type="hidden" name="token" value="PUT THE VALUE OF THE AUTHENTICATION COOKIE HERE" />
<button type="submit">Go to bar.com</button>
</form>
- ユーザは、認証 Cookie を に送信し
bar.com
ます。このフォーム送信を受け取ったスクリプトは、投稿された認証トークンの値を読み取り、FormsAuthentication.Decrypt
メソッドを使用して認証チケットを復号化し、ユーザー名を読み取ります。両方のアプリケーションが同じマシン キーfoo.com
をbar.com
使用しているため、foo.com で暗号化されたチケットは bar.com によって正常に復号化されます。
- トークンから認証されたユーザー名を抽出したスクリプトは、メソッドを使用して
bar.com
有効なフォーム認証 Cookie を発行します。bar.com
FormsAuthentication.SetAuthCookie
- ユーザーは現在認証されています
bar.com
このモデルの全体的なセキュリティは、フォーム認証トークンを から に POST するときに SSL が使用されるため、中間者がトークンを取得できず、両方のアプリケーションが暗号化と復号化のために同じマシン キーを共有するという事実に依存しfoo.com
ていbar.com
ます。それらのトークン。