我在Windows Azure中托管了两种不同的REST API,例如身份验证API和业务API。
身份验证API负责使用WsFederation或OpenID或自定义身份验证来验证用户
业务API负责执行业务逻辑。只有合法用户才能访问此API。
客户将首先联系身份验证API,并将获取令牌,然后将令牌传递给Business API。
由于客户端可以将任何令牌发送到业务API。企业必须验证令牌。它根本无法信任令牌。由于令牌是由身份验证API生成的,因此业务API将如何验证令牌。
在身份验证API和业务API分别托管的情况下,验证令牌的标准方法是什么?
答案 0 :(得分:0)
好的参考文献
Principles of Token Validation (Vittorio's blog)-很棒的文章,大多数信息都是通用的,因此无论是否使用Azure AD都适用,并且当然来自一位知识渊博的作者
Manually validating a JWT access token in a web API-此密钥特定于验证Azure AD颁发的令牌。也有完整的代码实现。您不需要完全这样做,因为您的验证将取决于您使用的令牌格式/声明,但可能会提供有用的参考。
作为案例研究,您可以查看如何建议对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发行的令牌为例,以下是应验证的重要令牌:
从Azure AD采样JWT令牌 实际值:eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1N ...(已编码的长字符串继续)解码后的值(您可以使用https://jwt.ms或https://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)。您的情况将取决于令牌的格式/实现等。