如何获取和使用正确的signedKey进行Azure移动应用程序身份验证?

时间:2016-11-18 05:56:06

标签: azure asp.net-core jwt azure-mobile-services asp.net-core-middleware

我正在使用更新的Azure Mobile Apps以及Google,Microsoft,Twitter和Facebook等身份验证提供程序来验证我网站的用户身份。所有这些都运行良好,在使用我的Azure Mobile App实例进行身份验证后,我找回了代表经过身份验证的用户的有效JWT令牌。这个令牌我正在转向并作为Authentication Bearer令牌发送到服务器,以验证对另一个ASP.NET Core API服务的请求。所有这一切都很好。

问题是使用正确的JWT值在服务器上验证signing key。对于测试 - 如果我将JWT令牌带到https://jwt.io/ 使用正确的算法AzureHS256粘贴我的密钥,我仍然无法通过“无效签名”错误。在同一区域,如果我调用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>

1 个答案:

答案 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#。