使用PKCE

时间:2019-04-04 21:34:59

标签: c# authentication asp.net-core oauth .net-core

我正在尝试在.NET Core中实现OAuth authentication with PKCE

this tutorial之后,我实现了纯OAuth部分。 然后,检查PKCE的工作原理,我看到了诸如this one之类的教程,其中显示了如何使用OpenID来实现它。

如果我们查看本教程,则PKCE需要完成两个主要步骤:

  1. code_challenge添加到授权请求中。
  2. 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的任何想法?

预先感谢

0 个答案:

没有答案