0

我设置了一个简单的 Azure 函数来测试 Azure 媒体服务。我正在尝试保护我上传的视频,但我似乎无法正确使用 JWT。这是简单的功能代码。

    [FunctionName("Test")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        var expires = DateTimeOffset.UtcNow.AddMinutes(20);
        var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("RYhzAnz....VP0uQ==")); // removed full key for brevity
        var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
        var claims = new List<Claim>
        {
        };

        var token = new JwtSecurityToken("http://test.net/",
            "urn:user",
            claims.AsEnumerable(),
            expires: expires.LocalDateTime,
            signingCredentials: credentials
        );

        return new OkObjectResult(new JwtSecurityTokenHandler().WriteToken(token));
    }

我已在令牌中填写了颁发者/受众,以便它与我的 Azure 设置中的内容相匹配。

在此处输入图像描述

我什至在 jwt.io 上验证了该令牌,并且验证正确

在此处输入图像描述

但是当我在 Azure 媒体播放器上对其进行测试时,响应是带有 AuthorizationPolicyEvaluationFailure 的 401。

在此处输入图像描述

这是来自 Azure 密钥传递服务的响应

{
  "Error": {
    "Message": "Failed content key policy evaluation.",
    "Code": "AuthorizationPolicyEvaluationFailure"
  }
}
4

3 回答 3

1

发现我做错了什么。问题隐藏在显而易见的地方。问题归结为这行代码。

Encoding.UTF8.GetBytes("RYhzAnz....VP0uQ==")

这是获取安全密钥的字节,但安全密钥本身是 base64 编码的。我不得不把它改成这个。

System.Convert.FromBase64String("RYhzAnz....VP0uQ==")

在调试Azure 媒体服务AES 示例时,我能够弄清楚这一点。

于 2019-12-03T14:32:17.710 回答
1

我认为您忘记将内容密钥 ID 放在声明中。您的政策可能要求这样做。这是生成令牌之前要添加的行:

claims.Add(new Claim(ContentKeyPolicyTokenClaim.ContentKeyIdentifierClaim.ClaimType, keyIdentifier));
于 2019-12-02T17:20:15.563 回答
0

在下面两行评论可以帮助我解决这个问题....

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(TokenSigningKey);
于 2020-05-20T09:30:25.193 回答