Я пытаюсь реализовать OAuth-аутентификацию с PKCE в .NET Core.
После этого урока Мне удалось реализовать чистую часть OAuth.Затем, проверяя, как работает PKCE, я видел учебники, такие как , этот , который показывает, как реализовать его с использованием OpenID
.
. Если мы проверим учебник, то для PKCE потребуется два основных шага.:
- Добавьте
code_challenge
к запросу авторизации. - Добавьте
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
в запросе токена?
Заранее спасибо