SAML / ADFS node.js实现指南?

问题描述 投票:45回答:3

我想先说这个,直到现在,我甚至没有听过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的“类似于解释的方式”吗?或者帮助我对我概述的两个解决方案所要求的论证对象做出正面或反面的讨论?非常感谢提前!

node.js single-sign-on saml-2.0 adfs
3个回答
92
投票

我最近经历了相同的思考过程:从未听说过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。 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身份验证,因此passport-saml策略使用浏览器会话和可配置的身份提供程序值启用Passport身份验证。

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

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

  • entryPoint是使用授权请求重定向到的URL(参见上面的#2)。
  • path / callbackURL在Node中设置要发布的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服务器以响应Node。


1
投票

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

拉出X509证书。我有同样的问题,我接下来会尝试。


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.