使用Passport-Azure-AD利用状态/惯例



我在找出customState的目的以及如何利用它将数据传递到返回URL时遇到了麻烦。具体而言,我希望在签名后将用户路由回到其原始位置。我认为我可以将原始URL传递到参数customState,并在返回URL POST中返回给我,但似乎已编码或也许是用不同的值代替。

这是我想实现的:

  1. 匿名用户访问需要身份验证的/page/protected
  2. 代码调用 passport.authenticate,反过来将用户重定向登录。
  3. 用户登录并返回到预先配置的返回URL,例如: /auth/oidc/return
  4. 代码处理从形式数据中提取信息。
  5. 用户被引导回/page/protected

返回URL(例如"/page/prectected")可以通过:

圆形传播

1)在身份验证中间件重定向到Azure AD B2C之前设置" CustomState"参数:

app.get('/login', function (req, res, next) {
  passport.authenticate('azuread-openidconnect', {
    response: res,
    resourceURL: config.resourceURL,
    customState: '/page/protected', // Or set to the current URL
    failureRedirect: '/'
  })(req, res, next);
}, function (req, res) {
  res.redirect('/');
});

2)在身份验证中间件之后获取req.body.state参数验证了Azure AD B2C的身份验证响应:

app.post('/auth/openid/return', function (req, res, next) {
  passport.authenticate('azuread-openidconnect', {
    response: res,
    failureRedirect: '/'
  })(req, res, next);
}, function (req, res) {
  res.redirect(req.body.state);
});

应加密" customstate"参数值,这意味着如果您不希望返回URL篡改。

,则必须将req.body.state参数解密。

否则,通常在身份验证中间件重定向之前将返回URL写入req.session并将身份验证请求发送到Azure AD B2C,然后在Autheration Middleware接收和验证后从req.session中读取(然后删除)此返回URLAzure AD B2C的身份验证响应。

最新更新