身份验证服务生成的业务API中的REST验证令牌

时间:2018-11-03 08:43:19

标签: rest azure token access-token ws-federation

我在Windows Azure中托管了两种不同的REST API,例如身份验证API和业务API。

身份验证API负责使用WsFederation或OpenID或自定义身份验证来验证用户

业务API负责执行业务逻辑。只有合法用户才能访问此API。

客户将首先联系身份验证API,并将获取令牌,然后将令牌传递给Business API。

由于客户端可以将任何令牌发送到业务API。企业必须验证令牌。它根本无法信任令牌。由于令牌是由身份验证API生成的,因此业务API将如何验证令牌。

在身份验证API和业务API分别托管的情况下,验证令牌的标准方法是什么?

1 个答案:

答案 0 :(得分:0)

好的参考文献


作为案例研究,您可以查看如何建议对Azure Active Directory保护的应用程序进行令牌验证(然后可能是其他一些系统),然后决定哪种方法最适合您的案例。

关于Azure AD示例的相关性的简要说明..就像您的情况一样,需要验证收到的令牌

当您开发任何由Azure Active Directory保护的Web API(或Web应用程序)并使用基于承载令牌的身份验证时,事情的流向与您上面对2个API的解释非常相似(仅出于理解目的,您的身份验证API正在执行Azure AD令牌终结点将执行的操作(即提供有效的令牌)。

要访问安全的Web API,调用应用程序/客户端首先与Azure AD端点进行交互以获取所需资源的相关令牌,然后将对实际资源的请求以及Authorization标头中的令牌发送到Web API。现在,Web API要做的第一件事就是验证此令牌,并且只有在一切正确的情况下,才继续执行以最终返回响应。我希望这与您的流程高度匹配。

要验证什么?

1。令牌签名

用于对已发行令牌进行签名的密钥与发行机构唯一关联,因此没有其他人可以使用您的机构签名来发行令牌。

a。这有助于检查令牌是否实际上是由Azure AD发出的(或者使用您提到的身份验证API,如果您是受信任的STS,则发出)。

b。这也可以确保自从令牌发行到到达您的Web API为止,没有人篡改过它。如果尝试更改令牌中的任何信息,则签名将中断。

2。代币声明

这取决于您作为令牌的一部分发送的声明/信息(例如,如果相同的Authentication API为多个不同的API发行令牌,那么诸如受众和发行者之类的内容也可能对您有意义。令牌有效时间期间使用类似下面的nbf和exp的方法也很通用)

以Azure AD发行的令牌为例,以下是应验证的重要令牌:

  • 受众声明(音频),以验证是否已将令牌授予您的应用程序
  • 不早于(nbf)和到期时间(exp)声明,以验证令牌已在其有效期内被接收
  • 发行人声明(瑞士),以验证该令牌实际上是由上述机构发行的。请注意,这是第二种方法,除了出于相同目的的签名外,签名和发行者支票通常一起使用。 (请参阅Vittorio的博客)
  • 立即,作为缓解令牌重放攻击的方法
  • 租户声明(提示),以验证租户。对于多租户应用程序,这很有用。

从Azure AD采样JWT令牌 实际值:eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1N ...(已编码的长字符串继续)解码后的值(您可以使用https://jwt.mshttps://jwt.io这样的网站轻松检查此值):

{
  "aud": "https://service.contoso.com/",
  "iss": "https://sts.windows.net/7fe81447-da57-4385-becb-6de57f21477e/",
  "iat": 1388440863,
  "nbf": 1388440863,
  "exp": 1388444763,
  "ver": "1.0",
  "tid": "7fe81447-da57-4385-becb-6de57f21477e",
  "oid": "68389ae2-62fa-4b18-91fe-53dd109d74f5",
  "upn": "frankm@contoso.com",
  "unique_name": "frankm@contoso.com",
  "sub": "deNqIj9IOE9PWJWbHsftXt2EabPVl0Cj8QAmefRLV98",
  "family_name": "Miller",
  "given_name": "Frank",
  "appid": "2d4d11a2-f814-46a7-890a-274a72a7309e",
  "appidacr": "0",
  "scp": "user_impersonation",
  "acr": "1"
}

如何进行令牌验证?

尽可能多地使用标准库。请参见代码实现示例Manually validating a JWT access token in a web API。这个使用了JwtSecurityTokenHandler.ValidateToken Method (JwtSecurityToken)。您的情况将取决于令牌的格式/实现等。