OAuth-аутентификация с PKCE - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь реализовать OAuth-аутентификацию с PKCE в .NET Core.

После этого урока Мне удалось реализовать чистую часть OAuth.Затем, проверяя, как работает PKCE, я видел учебники, такие как , этот , который показывает, как реализовать его с использованием OpenID.

. Если мы проверим учебник, то для PKCE потребуется два основных шага.:

  1. Добавьте code_challenge к запросу авторизации.
  2. Добавьте code_verifier к запросу токена.

Первый, который я могу сделать простохорошо, как вы можете видеть на комментарии ниже.Проблема возникает, когда мне нужно добавить code_verifier в запрос токена.Насколько я понял, промежуточное ПО .Net Core уже позаботилось о том, чтобы код авторизации и запрос токена выполнялись автоматически, не спрашивая меня, и я не смог найти место для перехвата запроса токена и добавления в него code_verifier.Поэтому в основном я получаю сообщение об ошибке от моего провайдера OAuth, в котором говорится, что запрос не содержит code_verifier.

Вот мой код:

.AddOAuth("MyOAuth", options =>
{
    options.ClientId = securityConfig.ClientId;
    options.ClientSecret = securityConfig.ClientSecret;
    options.CallbackPath = new PathString("/auth/oauthCallback");

    options.AuthorizationEndpoint = securityConfig.AuthorizationEndpoint;
    options.TokenEndpoint = securityConfig.TokenEndpoint;
    options.UserInformationEndpoint = securityConfig.UserInfoEndpoint;

    options.Events = new OAuthEvents
    {
        OnCreatingTicket = async context =>
        {
            var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);

            var response = await context.Backchannel.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.HttpContext.RequestAborted);
            response.EnsureSuccessStatusCode();

            var user = await response.Content.ReadAsStringAsync();

            var jUser = JObject.Parse(user);

            context.RunClaimActions(jUser);

        },
        OnRedirectToAuthorizationEndpoint = context =>
        {

            //var codeVerifier = CryptoRandom.CreateUniqueId(32);

            //context.Properties.Items.Add("codeVerifier", codeVerifier);

            //string codeChallenge;
            //using (var sha256 = SHA256.Create())
            //{
            //    var challengeBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(codeVerifier));
            //    codeChallenge = Base64Url.Encode(challengeBytes);
            //}

            //context.RedirectUri += $"&code_challenge={codeChallenge}&code_challenge_method=S256";

            context.Response.Redirect(context.RedirectUri);
            return Task.CompletedTask;
        },
        OnTicketReceived = context => Task.CompletedTask
    };
});

Любые идеи о том, как мне следует передатьcode_verifier в запросе токена?

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...