我正在使用更新的Azure Mobile Apps
以及Google,Microsoft,Twitter和Facebook等身份验证提供程序来验证我网站的用户身份。所有这些都运行良好,在使用我的Azure Mobile App
实例进行身份验证后,我找回了代表经过身份验证的用户的有效JWT
令牌。这个令牌我正在转向并作为Authentication Bearer
令牌发送到服务器,以验证对另一个ASP.NET Core
API服务的请求。所有这一切都很好。
问题是使用正确的JWT
值在服务器上验证signing key
。对于测试 - 如果我将JWT
令牌带到https://jwt.io/ 并使用正确的算法Azure
从HS256
粘贴我的密钥,我仍然无法通过“无效签名”错误。在同一区域,如果我调用ASP.NET Core API
来自app.UseJwtBearerAuthentication
Microsoft.AspNetCore.Authentication.JwtBearer
的{{1}}服务,我会从端点返回相同的401错误,说明以下内容:
401 Unauthorized:Bearer error =“invalid_token”,error_description =“The 签名无效“
根据Azure Mobile Apps offline WEBSITE_AUTH_SIGNING_KEY和其他一些网站,我应该使用https://[Azure-Mobile-Site-Here].scm.azurewebsites.net/Env.cshtml中的WEBSITE_AUTH_SIGNING_KEY
我已经获得了价值,并试图从星期日开始使用它作为{{{1} 1}}在服务器上,但没有成功。我总是得到同样的错误。
这是我在服务器上的配置。我试图尽可能地缩小它,反编译代码并只打开最小标志来验证。我无法得到任何东西。
IssuerSigningKey
如上所述,我已经尝试让private void ConfigureAuth(IApplicationBuilder app)
{
//Didn't work attempt #1
//byte[] keyBytes = Encoding.UTF8.GetBytes("975BE84E150ABlahBlahBlahA2527E1AAC80606");
//if (keyBytes.Length < 64)
//{
// Array.Resize(ref keyBytes, 64);
//}
//Didn't work attempt #2
//byte[] keyBytes = _UTF8Encoder.GetBytes("975BE84E150ABlahBlahBlahA2527E1AAC80606");
//Didn't work attempt #3
//var keyAsBytes = Convert.FromBase64String("975BE84E150ABlahBlahBlahA2527E1AAC80606");
//Didn't work attempt #4
//var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("975BE84E150ABlahBlahBlahA2527E1AAC80606"));
var signingKey = new SymmetricSecurityKey(keyBytes);
var tokenValidationParameters = new TokenValidationParameters
{
RequireExpirationTime = false,
RequireSignedTokens = false,
SaveSigninToken = false,
ValidateActor = false,
ValidateAudience = false,
ValidateIssuer = false,
ValidateLifetime = false,
//The signing key must match!
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = tokenValidationParameters
});
}
试图绕过这一切,但它没有用。我仍然得到同样的错误;这就像是对结果没有影响。
我感到迷茫和猜测,因为我甚至不确定ValidateIssuerSigningKey = false
是否正确WEBSITE_AUTH_SIGNING_KEY
,如果不是我正在旋转我的车轮。
为signingKey
实例生成secret / signing key
令牌时使用的正确JWT
是什么?如何在服务器上的中间件配置中正确地将其加密以验证令牌?< / p>
答案 0 :(得分:1)
WEBSITE_AUTH_SIGNING_KEY是适当的环境变量/应用设置。但是,它被编码为十六进制字符串。您需要在使用前对其进行解码。在Node SDK中,执行此操作的代码如下:
$orderData = "This is an order";
$json = json_encode($orderData);
curl_setopt_array($curl, array(
CURLOPT_URL => "http://localhost:9999/printpost.php",
CURLOPT_CAINFO => "C:\MAMP\conf\php7.0.0\cacert.pem",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => array(
"authorization: ".$oauthToken,
"content-type: application/json",
"programid: ".$programId
),
CURLOPT_POSTFIELDS => $json
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
您只需要将其转换为C#。