首先,我想说,直到现在,我还没有听说过SAML,更不用说开发了一个涉及它的SSO策略.再加上我几乎一年都没做过node,这就形成了一个很棒的新手三明治.目前,我有一个客户使用SAML和ADFS作为他们的SSO提供者.我已经在用Passport 了.js用于本地登录,因此使用passport saml似乎是使用saml/ADFS实现SSO的方法.在我的研究中,我发现了几个不同的实现指南,但由于我对这个过程一无所知,我可以使用一些指针.

在passport saml文档中,我发现了以下经证明适用于ADF的策略(根据文档):

{
  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.建议对ADF进行以下配置:

{
  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 中实现SAML/ADFS SSO的"解释式"方法吗.js网站?或者帮我把我所概述的两种解决方案所要求的论点对象弄清楚?非常感谢!

推荐答案

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

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

我逐渐意识到困惑有三个方面:

(1) SAML的工作原理,

(2) passport-saml库在 node 中的工作方式,以及

(3) 如何配置身份提供程序(OneLoginActive Directory或其他).接下来是我try 的"解释式"解释.

SAML

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

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

SAML SSO flow, OneLogin.com

该图表示以下过程:

  1. 用户单击按钮,使用SAML对给定应用程序(有时称为服务Provider )进行身份验证.请求(向 node 或其他方)生成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响应发回应用程序(服务Provider ).这个SAML响应(同样是XML)包含关于用户的某些属性,比如NameID.
  4. 回到Node,应用程序验证SAML响应并完成身份验证.

Node and 100

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

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

虽然passport-saml很好地满足了我的目的,但它的文档很难推理.由于OpenIdp身份提供程序处于非活动状态,并且有lots个可配置参数,因此配置示例无法正常工作.

我最关心的是:entryPointpath(或callbackURL).我只需要这两个,它们可以实现以下功能:

  • entryPoint是通过授权请求重定向到的URL(请参见上文#2).
  • path/callbackURL在 node 中设置要发布到的SAML响应的URL/route(参见上文#3).

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

Identity Provider configuration

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

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


Summary

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

至于与Active Directory的具体集成,我推荐passport-saml's docs on ADFS,请记住有两个部分:配置passport saml以使用ADFS身份提供程序,以及配置ADFS服务器以响应 node .

Node.js相关问答推荐

MongoServelSelection错误:服务器 Select 在30000 ms后超时

如何使用Node.js、Express和Mongoose创建多个API

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

Webpack:如何避免导出函数的重命名?

npm错误;无法解析依赖项:npm ERR!对等webpack@;5.x.x;来自@webpack-cli/serve@2.0.5";

如何修复node.js中的错误代码无法加载资源:服务器响应状态为403(禁止)

GitLab 依赖扫描需要源代码中的 package-lock.json 才能执行

动态设置元数据,无需重复请求 NextJS 13

将代码转换为 ES6 Discord.js 的问题

使用react 组件加载特定 DIV 而无需重新加载整个页面

使用 node/express/Multer,您如何首先判断参数?

如何调用同名的两个函数?

baseurl64 缓冲区解码

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

Express.js:没有这样的文件或目录

Node.js `--nolazy` 标志是什么意思?

找不到在 docker compose 环境中运行的 node js 应用程序的模块

`return function *(){...}` 是什么意思?

如何创建安全(TLS/SSL)Websocket 服务器

Firestore:多个条件 where 子句