SAML/ADFS node.js实现指南?

Spa*_*ope 50 adfs single-sign-on node.js saml-2.0

我想先说这个,直到现在,我甚至没有听过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
}
Run Code Online (Sandbox Code Playgroud)

我想我的主要问题是这个证书来自哪里?这是我通过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 ... ='
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,路径对象是显而易见的,我的提供者已经给了我一个providerURL.但是对我来说,境界毫无意义,而且还有那种证明.

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

小智 99

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

在实施过程中,我大量使用了OneLogin的文档和passport-saml库,我推荐这两个文档,尽管我也没有.

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

(1)SAML如何工作,

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

(3)如何配置身份提供者(OneLogin,Active Directory或其他).接下来是我尝试了一个"类似于解释的五个"解释.

SAML

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

SAML的工作方式更为复杂.我发现OneLogin的这个概述和附图很有帮助:

SAML SSO流程,OneLogin.com

该图表示以下过程:

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

节点和 passport-saml

Passport.js是Node的身份验证中间件.它需要一种策略,passport-local在我们的例子中可能类似于或passport-saml.

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

虽然passport-saml很好地服务于我的目的,但它的文档很难理解.由于OpenIdp身份提供程序处于非活动状态并且有许多可配置参数,因此配置示例不起作用.

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

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

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

身份提供商配置

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

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


摘要

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

至于与Active Directory的专门集成,我建议在ADFS上使用passport-saml的文档,请记住有两个部分:配置passport-saml以使用ADFS身份提供程序并配置ADFS服务器以响应Node.