我正在尝试在.NET Core中实现OAuth authentication with PKCE。
在this tutorial之后,我实现了纯OAuth部分。
然后,检查PKCE的工作原理,我看到了诸如this one之类的教程,其中显示了如何使用OpenID
来实现它。
如果我们查看本教程,则PKCE需要完成两个主要步骤:
code_challenge
添加到授权请求中。code_verifier
添加到令牌请求中。我可以做的第一个就可以了,如下面的注释代码所示。
当我需要向令牌请求中添加code_verifier
时出现问题。
据我了解,.Net Core中间件已经负责自动获取授权码和令牌请求,而没有询问我,而且我找不到可以拦截令牌请求并将code_verifier
放到哪里的地方。它。因此,基本上我得到的是我的OAuth Provider发出的错误,告诉您请求不包含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
的任何想法?
预先感谢