web-dev-qa-db-ja.com

SAML / ADFS node.js実装ガイド?

これに先立ち、私はこれまでSAMLのことすら聞いたことはなく、それを使ったSSO戦略を開発したことはほとんどなかったと言いたいと思います。それは、私が1年間ほとんどノードをやっていないという事実と相まって、輝かしい初心者サンドイッチになります。現在、SSOプロバイダーとしてSAMLとADFSを使用しているクライアントがいます。すでにローカルログインにpassport.jsを使用しているため、passport-samlを使用してSAML/ADFSを使用してSSOを実装する方法と思われます。私の研究では、いくつかの異なる実装ガイドを見つけましたが、このプロセスについて文字通り何も知らないので、いくつかのポインターを使用できます。

Passport-samlのドキュメントで、ADFSで機能することが証明されている戦略について、次のことがわかりました(ドキュメントによる)。

{
  entryPoint: 'https://ad.example.net/adfs/ls/',
  issuer: 'https://your-app.example.net/login/callback',
  callbackUrl: 'https://your-app.example.net/login/callback',
  cert: 'MIICizCCAfQCCQCY8tKaMc0BMjANBgkqh ... W==',
  identifierFormat: null
}

私の主な質問は、この証明書はどこから来たのでしょうか?これはSSL経由でサーバー上で生成した証明書ですか?プロバイダーは提供していますか?

私の検索では、これも見つけました: https://github.com/auth0/passport-wsfed-saml2 、これはpassport-samlに基づいています。 ADFSには次の構成が推奨されます。

{
  path: '/login/callback',
  realm: 'urn:node:app',
  homeRealm: '', // optionally specify an identity provider 
  identityProviderUrl: 'https://auth10-dev.accesscontrol.windows.net/v2/wsfederation',
  cert: 'MIIDFjCCAf6gAwIBAgIQDRRprj9lv5 ... ='
}

この例では、パスオブジェクトは明らかであり、プロバイダーは既にプロバイダーURLを提供しています。しかし、レルムは私には意味がありません、そして、そのひどい証明書が再びあります。

Node.jsサイトでSAML/ADFS SSOを実装する「explain-like-i'm-five」の方法を誰かが教えてもらえますか?または、私が概説した2つのソリューションによって要求された引数オブジェクトの先頭または末尾を作成するのに役立ちますか?事前に感謝します!

49
SpacePope

私は最近同じ思考プロセスを経験しました:[〜#〜] saml [〜#〜]を聞いたことがないので、Webアプリケーションを有効にする必要がありました(Active Directoryの代わりに)IDプロバイダーとしてOneLoginを使用してSAML経由で認証する。

実装中に、私はOneLoginのドキュメントと_passport-saml_ライブラリを多用しましたが、どちらもお勧めではありませんが、どちらとも提携していません。

私が気づいたのは、混乱が3つあるということです。

(1)SAMLの仕組み、

(2)Nodeでの_passport-saml_ライブラリの動作、および

(3)アイデンティティプロバイダーの構成方法(OneLoginActive Directory 、 もしくはそうでないか)。以下は、「5のような説明」の説明に対する私の試みです。

[〜#〜] saml [〜#〜]

セキュリティアサーションマークアップ言語(SAML)は、ユーザーがブラウザーセッションに基づいてログインできるようにするXML標準です。これには多くの機能がありますが、基本的には、より簡単な認証プロセスが可能になります。ユーザーは、ユーザー名とパスワードを使用してフォームを送信するのではなく、ボタンをクリックできます。

SAMLの仕組みはもう少し複雑です。 OneLoginからのこの概要 と、添付の図が役に立ちました:

SAML SSO flow, OneLogin.com

この図は、次のプロセスを表しています。

  1. ユーザーはボタンをクリックして、SAMLを使用して特定のアプリケーション(サービスプロバイダーとも呼ばれます)を認証します。 (Nodeまたはその他)への)リクエストが行われ、SAML認証リクエストが作成されます。
  2. 認証リクエストが作成されます。この認証要求はXML( OneLoginの詳細を参照 )であり、エンコードおよび/または暗号化され、クエリパラメーターとしてURLに追加されます。 NodeブラウザをこのURLにリダイレクトします( https://domain.onelogin.com/trust/saml2/http-post/sso/123456?SAMLRequest = ... encodedXML .. 。)。
  3. OneLoginは、IDプロバイダーとして、ブラウザーセッションからユーザーが既にログインしているかどうかを判断します。ログインしていない場合、OneLoginのログインフォームでプロンプトが表示されます。その場合、ブラウザーはアプリケーション(サービスプロバイダー)にSAML応答をPOSTします。このSAMLレスポンス(再びXML)には、NameIDなど、ユーザーに関する特定のプロパティが含まれます。
  4. Nodeに戻ると、アプリケーションはSAML応答を検証し、認証を完了します。

Nodeおよび_passport-saml_

Passport.jsはNodeの認証ミドルウェアです。それには、_passport-local_のような戦略が必要です。この場合は、_passport-saml_です。

_passport-local_戦略はユーザー名/パスワードを使用したPassport認証を有効にするため、 _passport-saml_ 戦略はブラウザーセッションと設定可能なIDプロバイダー値を使用したPassport認証を有効にします。

_passport-saml_が私の目的を本当に果たした一方で、そのドキュメントを推論することは困難でした。 OpenIdp IDプロバイダーが非アクティブであり、lotsの構成可能なパラメーターがあるため、構成例は機能しません。

私が気にした主なもの:entryPointおよびpath(またはcallbackURL)。次のことを行うこれら2つだけが必要でした。

  • entryPointは、承認リクエストでリダイレクトするURLです(上記の#2を参照)。
  • path/callbackURLは、URL /ルートをNodeに設定します(上記の#3を参照)。

重要で価値のある他のパラメーターがたくさんありますが、これら2つだけを使用してSAML SSOを構成することは可能です。

アイデンティティプロバイダーの構成

最後に、SAML承認要求が与えられると、SAML応答の送信先を認識するように、IDプロバイダー自体を構成する必要があります。 OneLoginの場合、それはACS (Consumer) URLACS (Consumer) URL Validatorを設定することを意味します。どちらもパスポート用に設定されたpath/callbackURLと一致する必要があります。 saml。

(ログアウトおよびその他の機能をサポートするために)他の設定を行うこともできますが、これは最低限の認証です。


概要

元の質問には2つの部分がありました。(1)SAML/ADFS統合の実装方法と(2)高レベルSAML node.js実装ガイド。この答えは、2番目に対処します。

Active Directoryとの具体的な統合に関しては、ADFS IDプロバイダーを使用するようにpassport-samlを構成することと、応答するようにADFSサーバーを構成することの2つの部分があることに留意して、 passport-samlのADFSに関するドキュメント をお勧めしますノードへ。

私はここで間違っている可能性がありますが、https://servername/FederationMetadata/2007-06/FederationMetadata.xml

X509Certificateを引き出します。私は同じ問題を抱えており、次にそれを試します。

1
akanieski

質問の最初の部分に関しては、証明書はプロバイダーから提供されます。 passport-saml のドキュメントをご覧ください。

アイデンティティプロバイダーのパブリック署名証明書(X.509)を引き出して、PEMエンコーディングにフォーマットするようにしてください。正しくフォーマットされたPEMエンコードされた証明書は、-----BEGIN CERTIFICATE-----で始まり、-----END CERTIFICATE-----で終わります。

1
PhiNessa