1

我正在使用更新Azure Mobile Apps的身份验证提供商(如 Google、Microsoft、Twitter 和 Facebook)来对我的网站的用户进行身份验证。所有这些都运行良好,并且在使用我的Azure Mobile App实例进行身份验证后,我会返回一个JWT代表经过身份验证的用户的有效令牌。这个令牌我正在转身并作为Authentication Bearer令牌发送到服务器以验证对另一个ASP.NET CoreAPI 服务的请求。所有这些都工作得很好。

问题是JWT使用正确的signing key值在服务器上进行验证。进行测试 - 如果我将我的JWT令牌带到https://jwt.io/ Azure使用正确的算法粘贴我的密钥,HS256我仍然无法通过“无效签名”错误。在同一区域,如果我调用ASP.NET Core API已配置的服务,我会app.UseJwtBearerAuthenticationMicrosoft.AspNetCore.Authentication.JwtBearer端点返回相同的 401 错误,说明如下:

401 Unauthorized: Bearer error="invalid_token", error_description="签名无效"

根据Azure 移动应用程序离线 WEBSITE_AUTH_SIGNING_KEY和其他一些网站,我应该使用WEBSITE_AUTH_SIGNING_KEYhttps ://[Azure-Mobile-Site-Here].scm.azurewebsites.net/Env.cshtml我已经获得了价值并尝试从周日开始使用它作为IssuerSigningKey服务器上的 10 种方式,但均未成功。我总是得到同样的错误。

这是我在服务器上的配置。我试图尽可能缩小范围,反编译代码并只打开最小标志来验证。我什么都搞不定。

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令牌的正确方法是什么?Azure Mobile App如何正确地将其合并到服务器上的中间件配置中以验证令牌?

4

1 回答 1

2

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

于 2016-11-18T22:51:22.493 回答