Я получаю 401, когда я реализую AddJwtBearer и отмечаю успех на OnMessageReceived (ctx) в dotnet Core 2 - PullRequest
0 голосов
/ 11 апреля 2019

Вот код для Startup.cs:

var appSettings = appSettingsSection.Get<AppSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.Auth0MachineToMachineSecret);

services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
    x.Events = new JwtBearerEvents
    {
        OnTokenValidated = (ctx) =>
        {
            return Task.CompletedTask;
        },
        OnMessageReceived = (ctx) =>
        {
            string token = ctx.Request.Headers["Authorization"].ToString().Replace("Bearer ", string.Empty);
            IDictionary<string, object> headers = AuthenticationHelper.JwtHeaders(token);
            ctx.Token = ctx.Request.Headers["Authorization"].ToString();

            // Validate the HS256 Key using a PSK
            if (headers.ContainsKey("alg") && headers["alg"].ToString() == "HS256")
            {
                string secret = appSettings.Auth0MachineToMachineSecret;
                string payload = AuthenticationHelper.JwtDecode(token, secret);
                ctx.Principal = this.SetTokenInfo(JObject.Parse(payload), appSettings.Auth0AppMeta, ctx);
            }

            // Validate token with a public RSA key published by the IDP as a list of JSON Web Keys (JWK)
            // step 0: you've read the keys from the jwks_uri URL found in http://<IDP authority URL>/.well-known/openid-configuration endpoint
            if (headers.ContainsKey("alg") && headers["alg"].ToString() == "RS256")
            {
                IDPKey iDpKey = AuthenticationHelper.FindIdpKey(headers, "kid", AuthenticationHelper.GetIdpKeys(appSettings.Auth0Tenant));

                if (iDpKey == null)
                {
                    return Task.CompletedTask;
                }

                //If everything is good set the Authorization as true and the CRM user.
                JObject payload = AuthenticationHelper.ParsePayload(token);
                ctx.Principal = this.SetTokenInfo(payload, appSettings.Auth0AppMeta, ctx);
            }

            ctx.Token = token;

            ctx.Success();

            return Task.CompletedTask;
        }
    };
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(key),
        ValidateIssuer = false,
        ValidateAudience = false
    };
});

// configure DI for application services
services.AddScoped<IUserService, UserService>();

Мой контроллер всегда возвращает 401 в конечной точке, хотя я знаю, что я предоставляю правильные коды JWT (проверено с помощью jwt.io):

[AllowAnonymous]
[HttpGet("all")]
public IActionResult GetAll()
{
    var users =  _userService.GetAll();
    return Ok(users);
}

Важно знать, что я не провайдер oAuth ... это auth0, но все это в конфигурации, и я использую его только для того, чтобы убедиться, что пользователи имеют право использовать мой вебAPI 2.2 Core Web API конечной точки.

OnMessageReceived запускается, и я устанавливаю свой принципал на нем и отмечаю его как успешный (в противном случае он всегда будет идти к OnAuthenticationFailed), а затем я получаю ответ 401 в Fiddler, даже если код на предъявителя проверенв jwt.io.

Любая помощь с благодарностью.

...