我尝试使用
validate-jwt
策略限制使用 JWT 令牌对 REST API 的访问。以前从来没有这样做过。
这是我的入站策略(取自简单令牌验证此处):
<validate-jwt header-name="Authorization" require-scheme="Bearer">
<issuer-signing-keys>
<key>{{jwt-signing-key}}</key>
</issuer-signing-keys>
<audiences>
<audience>CustomerNameNotDns</audience>
</audiences>
<issuers>
<issuer>MyCompanyNameNotDns</issuer>
</issuers>
</validate-jwt>
使用这个生成器我创建了一个声明(我不确定我是否正确理解了发行者和受众):
{
"iss": "MyCompanyNameNotDns",
"iat": 1572360380,
"exp": 2361278784,
"aud": "CustomerNameNotDns",
"sub": "Auth"
}
在签名 JSON Web 令牌部分中,我从组合框中选择了生成 64 位密钥。我将生成的密钥放在 {{jwt-signing-key}} 的位置。
现在,我尝试使用 Postman 调用 API。我添加了一个“授权”标头,并将“承载 {{ JWT 由 linked 生成器 }} 创建”作为值。
我收到 401,JWT 不存在。我做错了什么?
根据我的研究,如果您使用 HS256 签名算法,则必须以 Base64 编码形式在策略内内联提供密钥。换句话说,我们必须将密钥编码为 base64 字符串。更多详情请参阅文档
我的测试步骤如下
Jim Xu 的回答将密钥编码为策略中的 base64 字符串让我能够走到这一步:-)
我将 Ocp-Apim-Trace 参数设置为 true,以便更仔细地调试它。我按照 ocp-apim-trace-location 下的响应中提供的链接进行操作,在“错误”部分中我发现了以下消息:
JWT Validation Failed: IDX10225: Lifetime validation failed. The token is missing an Expiration Time. Tokentype: 'System.IdentityModel.Tokens.Jwt.JwtSecurityToken'..
这很有趣,因为我已将过期时间...设置为 2099。
我把它改为一个月后,效果很好。
您可以使用此网站https://www.base64encode.org/,而不是使用“Convert.ToBase64String(Encoding.UTF8.GetBytes(”),并将您的令牌密钥转换为 Base64 字符串,并将其直接作为密钥API 管理。
它对我有用。