SAML / ADFS node.js实现指南?

时间:2014-11-13 04:31:30

标签: node.js single-sign-on saml-2.0 adfs

我想先说这个,直到现在,我甚至没有听过SAML,更不用说涉及它的SSO策略了。这一点,加上我几乎没有做节点一年的事实,就是一个光荣的新手三明治。目前,我有一个客户端使用SAML和ADFS作为他们的SSO提供商。我已经使用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,它基于护照-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 ... ='
}

在这个例子中,路径对象很明显,我的提供者已经给了我一个providerURL。但是对我来说领域毫无意义,并且再次证明了这一点。

有人能为我提供一个在node.js网站上实现SAML / ADFS SSO的“类似于解释的方式”吗?或者帮助我对我概述的两个解决方案所要求的论证对象做出正面或反面的讨论?非常感谢提前!

3 个答案:

答案 0 :(得分:86)

我最近经历了相同的思考过程:从未听说过 SAML ,我需要启用一个Web应用程序,通过SAML将OneLogin作为身份提供程序(而不是Active Directory)进行身份验证。

在实施过程中,我大量使用了OneLogin的文档和passport-saml库,我建议使用这两种文档,尽管我并不隶属于它们。

我开始意识到混乱是三重的:

(1)SAML如何运作,

(2)passport-saml库如何在Node中工作,

(3)如何配置身份提供商( OneLogin Active Directory 或其他方式)。接下来是我尝试了一种“类似于解释的解释”的解释。

<强> SAML

安全断言标记语言(SAML)是一种XML标准,允许用户根据其浏览器会话登录。它有很多,但基本上,它可以实现更简单的身份验证过程。用户可以单击按钮而不是提交包含用户名和密码的表单。

SAML的工作方式更为复杂。我发现this overview from OneLogin和随附的图表很有帮助:

SAML SSO flow, OneLogin.com

该图表示以下过程:

  1. 用户单击按钮以使用SAML对给定应用程序(有时称为服务提供商)进行身份验证。发出请求(以节点或其他方式)以构建SAML授权请求。
  2. 构建授权请求。此授权请求是XML(see more on OneLogin),已编码和/或加密,并作为查询参数附加到URL。节点将浏览器重定向到此URL(类似https://domain.onelogin.com/trust/saml2/http-post/sso/123456?SAMLRequest=...encodedXML..。)。
  3. OneLogin ,作为身份提供商,从浏览器会话中确定用户是否已登录。如果没有,则提示用户使用OneLogin的登录表单。如果是,则浏览器将SAML响应POST回应用程序(服务提供商)。此SAML响应(同样是XML)包括有关用户的某些属性,如NameID。
  4. 返回Node,应用程序验证SAML响应并完成身份验证。
  5. 节点和passport-saml

    Passport.js是Node的身份验证中间件。它需要一个策略,可以是passport-local,或者在我们的例子中,passport-saml

    由于passport-local策略使用用户名/密码启用Passport身份验证,passport-saml策略会使用浏览器会话和可配置的身份提供商值启用Passport身份验证。

    虽然passport-saml非常适合我的目的,但其文档难以推理。配置示例不起作用,因为OpenIdp身份提供程序处于非活动状态并且有 lot 的可配置参数。

    我关心的主要内容:entryPointpath(或callbackURL)。我只需要这两个,它们执行以下操作:

    • entryPoint是使用授权请求重定向到的网址(请参阅上面的#2)。
    • path / callbackURL在节点中设置要发布的SAML响应的URL /路由(请参阅上面的#3)。

    还有大量其他重要且有价值的参数,但只使用这两个参数就可以配置SAML SSO。

    身份提供商配置

    最后,需要配置身份提供程序本身,以便在给定SAML授权请求的情况下,它知道在何处发送SAML响应。对于OneLogin,这意味着设置ACS (Consumer) URLACS (Consumer) URL Validator,这两者都应与为passport-saml配置的path / callbackURL匹配。

    可以配置其他内容(支持注销和其他功能),但这是验证的最低要求。

    <强>摘要

    原始问题分为两部分:(1)如何实现SAML / ADFS集成和(2)高级SAML node.js实现指南。这个答案解决了第二个问题。

    至于与Active Directory的专门集成,我建议passport-saml's docs on ADFS,请记住,有两个部分:配置passport-saml以使用ADFS身份提供程序并配置ADFS服务器以响应节点。

答案 1 :(得分:0)

我可能在这里错了,但我相信它来自https://servername/FederationMetadata/2007-06/FederationMetadata.xml处的ADFS服务器XML。

取出X509证书。我有同样的问题,我将尝试下一步。

答案 2 :(得分:0)

对于问题的第一部分,证书来自提供者。请查看passport-saml文档。

只需取出身份提供者的公共签名证书(X.509),并确保将其格式化为PEM编码。格式正确的PEM编码证书将以-----BEGIN CERTIFICATE-----开头,以-----END CERTIFICATE-----结尾。