0

我正在使用更新的Azure Mobile Apps以及Google,Microsoft,Twitter和Facebook等身份验证提供程序对我的网站的用户进行身份验证。所有这一切都运行良好,并通过对我的Azure Mobile App实例进行身份验证后,我得到一个代表经过身份验证的用户的有效JWT令牌。这个令牌我正在转向并发送一个Authentication Bearer令牌给服务器以验证对另一个ASP.NET Core API服务的请求。所有这一切都工作得很好。如何获取并使用适当的签名密钥进行Azure移动应用程序身份验证?

问题是在服务器上使用正确的signing key值验证JWT值。对于测试 - 如果我使用正确的算法HS256将我的JWT令牌粘贴到https://jwt.io/从我的密钥Azure粘贴到我的密钥我仍无法超过“无效签名”错误。在同一地区,如果我把我的ASP.NET Core API服务,具有app.UseJwtBearerAuthenticationMicrosoft.AspNetCore.Authentication.JwtBearer配置的I得到相同的401错误回从端点载明下列:

401未经授权:承载错误=“INVALID_TOKEN”,ERROR_DESCRIPTION =“的 签名无效”

根据Azure Mobile Apps offline WEBSITE_AUTH_SIGNING_KEY,我应该使用WEBSITE_AUTH_SIGNING_KEYhttps://[Azure-Mobile-Site-Here].scm.azurewebsites.net/Env.cshtml我得到的价值,并试图利用它的10种从星期日为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,如果它不是我正在旋转我的轮子。

用于为Azure Mobile App实例生成JWT令牌的合适secret/signing key是什么,以及如何在服务器上的中间件配置中正确地合并它以验证令牌?

回答

1

WEBSITE_AUTH_SIGNING_KEY是适当的环境变量/应用程序设置。但是,它被编码为一个十六进制字符串。你需要在使用前解码它。在Node SDK中,执行此操作的代码如下所示:

function hexStringToBuffer(hexString) { 
    var bytes = []; 
    for (var i = 0; i < hexString.length; i += 2) 
     bytes.push(parseInt(hexString.substr(i, 2), 16)); 
    return new Buffer(bytes); 
} 

您只需将其转换为C#。

+1

是的,谢谢!我无法了解它是如何编码的,因此也是猜测。感谢您的帮助。从这里工作的C#代码示例:http://stackoverflow.com/a/724905/410937 – atconway

相关问题