C# 使用PKCE的OAuth身份验证
我正在尝试在.NETCore中实现 接下来,我能够实现纯OAuth部分。 然后,在检查PKCE的工作原理时,我看到了类似的教程,它们展示了如何使用C# 使用PKCE的OAuth身份验证,c#,authentication,asp.net-core,oauth,.net-core,C#,Authentication,Asp.net Core,Oauth,.net Core,我正在尝试在.NETCore中实现 接下来,我能够实现纯OAuth部分。 然后,在检查PKCE的工作原理时,我看到了类似的教程,它们展示了如何使用OpenID实现它 如果我们查看教程,PKCE需要两个主要步骤: 将code\u challenge添加到授权请求中 向令牌请求添加code\u验证器 第一个我可以做的很好,你可以在下面的注释代码中看到。 当我需要向令牌请求添加code\u验证器时,就会出现问题。 据我所知,.Net核心中间件已经负责自动获取授权代码和令牌请求,而不需要询问我,而且我找
OpenID
实现它
如果我们查看教程,PKCE需要两个主要步骤:
code\u challenge
添加到授权请求中code\u验证器
code\u验证器时,就会出现问题。
据我所知,.Net核心中间件已经负责自动获取授权代码和令牌请求,而不需要询问我,而且我找不到一个地方来拦截令牌请求并将code\u验证器
放在上面。因此,基本上我得到的是OAuth提供者的一个错误,告诉我请求不包含code\u验证器
这是我的密码:
.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\u验证器
有什么想法吗
提前谢谢