1

处理 WebApp <=> WebApi 身份验证方案,我从 WebApp 中的 Azure AD 获取 JWT 令牌并将其传递给 WebApi。在 WebApi 中,从 WebApp 的令牌生成 Azure GraphAPI 的访问令牌,以调用 GraphAPI 进行授权。

WebApp 和 WebApi 都在 Azure 租户门户上注册为单个应用程序,因为 WebApp 和 WebApi 的用户身份验证相同。

这是一个 Intranet 应用程序,对 AD 中的所有用户开放。与令牌验证或身份验证相关的几个问题。

  1. 我是否需要在 WebApp 和 WebApi 的令牌中验证租户和受众?
  2. 我还需要在 WebApp、WebApi 或两者中执行哪些其他令牌验证?

因为 JWT 令牌是经过数字签名和加密的。当令牌从 WebApp 传递时,不在 WebApi 中进行验证会产生什么影响?

请指教。

4

2 回答 2

1

我们仅对 Audience 进行验证(如果您的应用程序不是多租户,您可以使用租户,但对于我们来说,因为它是多租户,我们使用“common”作为租户)。

如果我们不在 API 中进行受众验证,那么任何获取图形令牌的应用程序都可以调用您的应用程序(唯一会发生的验证是令牌是否过期)。

JWT 令牌未加密,它是 base 64 编码的,您可以使用http://jwt.calebb.net/等工具 查看令牌中的属性。

于 2015-09-05T00:14:53.337 回答
1

经过长时间的尝试,我想出了这个:

需要检索第一个 x5c 密钥:https ://login.windows.net/common/discovery/keys

然后,安装https://github.com/auth0/node-jsonwebtoken 不幸的是该库不支持证书验证。您需要将其转换为密钥(私有或公共)。

那么代码将是:

    function insertNewlines(certificate) {
        for (var i = 64; i < certificate.length; i += 65) {
            certificate = certificate.slice(0, i) + '\n' + certificate.slice(i);
        }
        return certificate;
    }

    function addBoundaries(certificate) {
        return "-----BEGIN CERTIFICATE-----\n" + certificate + "\n-----END CERTIFICATE-----";
    }

    function getPEM(certificate) {
        certificate = insertNewlines(certificate);
        certificate = addBoundaries(certificate);
        return certificate;
    }




    let id_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsI...";
    let cert = "MIIDBTCCAe2gAwIBAgIQZSAeaqWig4...";

    var pemContent = getPEM(cert);
    var jwt = require('jsonwebtoken');

    jwt.verify(id_token, pemContent, function(err, decoded) {
         //err Invalid signature
         // decode - valid data
    });
于 2017-06-24T10:43:01.927 回答