SAML/ADFS node.js 实施指南?
Posted
技术标签:
【中文标题】SAML/ADFS node.js 实施指南?【英文标题】:SAML/ADFS node.js implementation guide? 【发布时间】:2015-01-10 03:43:05 【问题描述】:首先我想说的是,到目前为止,我什至没有听说过 SAML,更不用说开发涉及它的 SSO 策略了。再加上我一年来几乎没有做 node 的事实,这使我成为了一个光荣的新手三明治。目前,我有一个使用 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,它基于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 ... ='
在这个例子中,路径对象是显而易见的,我的提供者已经给了我一个providerURL。但是领域对我来说毫无意义,又是那个该死的证书。
有人可以为我提供一种在 node.js 站点中实施 SAML/ADFS SSO 的“类似解释”的方式吗?或者帮助我对我概述的两个解决方案所要求的参数对象进行正面或反面?非常感谢提前!
【问题讨论】:
你在这方面有什么进展吗? ADFS 本身就是一种复杂的野兽。所以 - 开始......这个应用程序的目的是什么?您只是想将 ADFS 用作 SSO 提供程序吗? (SAML -> 安全断言标记语言en.wikipedia.org/wiki/Security_Assertion_Markup_Language) 【参考方案1】:我最近经历了同样的思考过程:我从未听说过 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 对给定应用程序(有时称为服务提供者)进行身份验证。 (向 Node 或其他)发出请求以构建 SAML 授权请求。
构造了一个授权请求。此授权请求是 XML (see more on OneLogin),经过编码和/或加密,并作为查询参数附加到 URL。 Node 将浏览器重定向到此 URL(类似于https://domain.onelogin.com/trust/saml2/http-post/sso/123456?SAMLRequest=...encodedXML..。)。
OneLogin,作为身份提供者,从浏览器会话中确定用户是否已经登录。如果没有,则使用 OneLogin 的登录表单提示用户。如果是这样,浏览器会将 SAML 响应 POST 回应用程序(服务提供者)。此 SAML 响应(同样是 XML)包含有关用户的某些属性,例如 NameID。
返回 Node,应用程序验证 SAML 响应并完成身份验证。
节点和passport-saml
Passport.js 是 Node 的身份验证中间件。它需要一个策略,可能类似于passport-local
,或者在我们的例子中是passport-saml
。
由于 passport-local
策略启用使用用户名/密码的 Passport 身份验证,passport-saml
策略启用使用浏览器会话和可配置身份提供程序值的 Passport 身份验证。
虽然passport-saml
非常适合我的目的,但它的文档很难理解。由于 OpenIdp 身份提供者处于非活动状态并且有 很多 个可配置参数,因此配置示例不起作用。
我关心的主要是:entryPoint
和path
(或callbackURL
)。我只需要这两个,它们执行以下操作:
entryPoint
是授权请求重定向到的 URL(参见上面的 #2)。
path
/callbackURL
在 Node 中设置 URL/路由,以便将 SAML 响应发布到(参见上面的 #3)。
还有大量重要且有价值的其他参数,但可以仅使用这两个参数来配置 SAML SSO。
身份提供者配置
最后,身份提供者本身需要进行配置,以便在收到 SAML 授权请求时,它知道将 SAML 响应发送到哪里。对于 OneLogin,这意味着设置一个 ACS (Consumer) URL
和一个 ACS (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 服务器以响应 Node。
【讨论】:
谢谢。在我阅读了大量教程并实现了一半 SAML 之后,我找到了这个答案。它给了我一个提示,我在正确的道路上。 惊人的帖子,你们有没有一些示例代码,或者你可以将它上传到 gist 以便我可以看到它 嗨,感谢您澄清这一点。关于我正在处理的技术堆栈,我对此有一个问题。我正在使用 angular (frontend) + java spring boot(backend),我对在第 2 步中应该重定向到 IdP 并在第 3 步中接收响应的技术感到困惑。我认为这里是 spring boot(对吗?)。如果是 Spring Boot,回调 url 会是 Spring 的吗?而一旦spring收到响应,是否会重定向回浏览器到前端?【参考方案2】:我在这里可能是错的,但我相信它来自在https://servername/FederationMetadata/2007-06/FederationMetadata.xml
找到的 ADFS 服务器 XML。
取出 X509 证书。我也遇到了同样的问题,接下来我会尝试。
【讨论】:
【参考方案3】:至于您问题的第一部分,证书来自提供者。请查看passport-saml 文档。
只需提取身份提供者的公共签名证书 (X.509) 并确保将其格式化为 PEM 编码。格式正确的 PEM 编码证书将以 -----BEGIN CERTIFICATE-----
开头并以 -----END CERTIFICATE-----
结尾。
【讨论】:
以上是关于SAML/ADFS node.js 实施指南?的主要内容,如果未能解决你的问题,请参考以下文章
Spring SAML ADFS:java.security.InvalidKeyException