C# 使用PKCE的OAuth身份验证

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核心中间件已经负责自动获取授权代码和令牌请求,而不需要询问我,而且我找

我正在尝试在.NETCore中实现

接下来,我能够实现纯OAuth部分。 然后,在检查PKCE的工作原理时,我看到了类似的教程,它们展示了如何使用
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验证器
    有什么想法吗

    提前谢谢