web-dev-qa-db-ja.com

SAMLを使用してサイト間を移動する

私はSSOシステムの開発を任されており、SAML仕様の使用に導かれました。いくつかの調査の結果、サービスプロバイダーとIDプロバイダーの間の相互作用と、ユーザーのIDが確認される方法を理解したと思います。しかし、ユーザーをanother Service Providerにリダイレクトするとどうなりますか?そこでユーザーの身元を確認するにはどうすればよいですか?リダイレクトリクエストと共に彼のSAMLアサーショントークンを送信しますか?または、2番目のサービスプロバイダーは、IDプロバイダーにもう一度連絡する必要がありますか?

3
System Down

わかりました、少し時間がかかりましたが、やってみます。私は、SAMLのSimpleSAMLphpとShibbolethの両方の実装を扱ってきました。 SimpleSAMLphpは、デモのIdPとSPをセットアップする2つの方法のうち、より簡単です。

いずれにせよ、ユーザーがすでに認証済みの同じIdPを使用する別のSPのドメインにユーザーがアクセスすると、IdPでマシンのCookieを使用して再認証するか、ユーザー名/パスワードの再入力を強制できます。 IdPでのログインセッションの継続時間を設定することもできます。

2番目のSPでIDを把握する方法は、基本的に最初のSPで行う方法と同じです。各ユーザーに送信されるユーザーデータを構成できますSP個別に、各SPは、そのSPのニーズに応じて、同じユーザーデータまたはカスタムユーザーデータを送信できます。

[〜#〜] edit [〜#〜] RE:リダイレクトリクエストと共に彼のSAMLアサーショントークンを送信しますか?または、2番目のサービスプロバイダーは、IDプロバイダーにもう一度連絡する必要がありますか?

SAML仕様では両方が許可されていると思います。 SPがIdPにヒットしてアサーショントークンを取得するか、またはクエリ文字列を指定して最初にIdPにアクセスするようにすることができます。 2番目のSP次に、ユーザーを2番目のSPにアサーショントークンと共にリダイレクトします。

EDIT#2ちなみに、時間と他のチームメンバーの支援がない限り、SAMLの独自の実装を記述しないことをお勧めします。ヘック、最後にチェックしたのは、ShibbolethがSAML仕様の完全な実装を持っていないことです。彼らは「SAMLの人々」です。また、カスタムで書かれた実装がある場合にサードパーティのSPまたはIdPをサポートする予定があると、相互運用性の問題が発生する可能性があります。

1
programmer

必要がなければ、実際に作業を行う必要はありません。私は前のコメントに同意します-SAMLライブラリを構築しないでください-それらは多くの形や形で存在します。

最初にこれを読んでください: https://wiki.shibboleth.net/confluence/display/SHIB2/UnderstandingShibboleth

SSOはShibbolethに付属しているので、ホイールを再発明するためにサルを使う必要もありません。これの完全なウォークスルーが必要な場合は、IdPのインストール全体とDrupal SP:

https://spaces.internet2.edu/display/ShibInstallFest/Shibboleth+Workshop+Series+-+Linux+Identity+Provider+%28Centos+6.2%29

「IdPとSPの内部フェデレーション」の信頼をどのように登録するかを考え出す必要がありますが、これは大規模なスキームのパズルの小さなピースです。

だからあなたの質問は:

しかし、ユーザーを別のサービスプロバイダーにリダイレクトするとどうなりますか?回答:SPソフトウェアがリクエストをインターセプトし、ユーザーがログインしているかどうかを検証します。ログインしていない場合はリダイレクトが発生します。ログインしている場合は、SP構成が(通常、IdPが属性を解放した後)解放される属性のゲートになります)。

そこでユーザーのIDを確認するにはどうすればよいですか?回答:上記を参照してください。賢くあなたの識別子を選択してください。識別子として電子メールを使用しないことを強くお勧めします。 TL; DRはメールの変更であり、悪い選択です。

リダイレクト要求と共に彼のSAMLアサーショントークンを送信しますか?

回答:あなたは気にしません。 Idp + SPソフトウェアで処理します。何が起きているのかをもっと深く理解する必要がある場合は、ドキュメントを読んでください。ただし、アプリの開発者は、そのことに煩わされる必要はありません。

または、2番目のサービスプロバイダーはIDプロバイダーにもう一度連絡する必要がありますか?

回答:IdPは、ユーザーが適切にサインインしたときに属性情報を取得するために参照されます。

「私はSSOシステムの開発を任されています」は、いくつかの計画と規模の考慮が必要になる可能性があります(例:テクノロジ、サイトの数など、ユーザーのオーディエンスに加えて、他のいくつかの計画に関する質問)。それらを釘付けにすることは健康です:)

2
Chris Phillips

私はこの質問への回答を探していましたが、何か明白なものが飛び出すまでにまだ1分かかりました。ユーザーがすでにidPでログインしている場合、サービスプロバイダーを次のサービスプロバイダーに移動すると、それぞれがidPに連絡し、idPは最初にログインしたときと同じCookieを表示します。

したがって、SP開始されたSSOを使用している場合、SPサイト間を移動するために実行する必要のある追加の作業はありません。以下は、いくつかの言い換えられたサンプルコードを解除したものです。コンポーネントスペースのidPサイト用の.net SAML実装から。一度ログインした後、SP間を移動すると、このコードはすでにログインしていることを認識し、ログインに送信するifブロックをスキップすることに注意してください。ページ:

public class SAMLController : Controller
{
    const string ssoPendingSessionKey = "ssoPending";

    public ActionResult SSOService()
    {
        // Either an authn request has been received or login has just completed in response to a previous authn request.
        // The SSO pending session flag is false if an authn request is expected. Otherwise, it is true if
        // a login has just completed and control is being returned to this page.
        bool ssoPending = (bool?)Session[ssoPendingSessionKey] == true;

        if (!ssoPending || !User.Identity.IsAuthenticated)
        {
            string partnerSP = null;

            // Receive the authn request from the service provider (SP-initiated SSO).
            SAMLIdentityProvider.ReceiveSSO(Request, out partnerSP);

            // If the user isn't logged in at the identity provider, force the user to login.
            if (!User.Identity.IsAuthenticated)
            {
                Session[ssoPendingSessionKey] = true;
                FormsAuthentication.RedirectToLoginPage();
                return new EmptyResult();
            }
        }

        Session[ssoPendingSessionKey] = null;

        // The user is logged in at the identity provider.
        // Respond to the authn request by sending a SAML response containing a SAML assertion to the SP.
        // Use the logged in user name as the user name to send to the service provider (SP).
        // Include some user attributes.
        string userName = User.Identity.Name;

        SAMLIdentityProvider.SendSSO(Response, userName, new Dictionary<string, string>());
        return new EmptyResult();
    }

    // ... other methods such as SLO
}
0
BVernon