首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OAuth无效Bas64

OAuth无效Bas64
EN

Stack Overflow用户
提问于 2021-01-09 02:53:29
回答 1查看 192关注 0票数 1

我正在尝试实现一个OAuth流,在我的客户服务中,我有以下代码行:

代码语言:javascript
复制
services.AddAuthentication(config => {
            // We check the cookie to confirm that we are authenticated
            config.DefaultAuthenticateScheme = "ClientCookie";
            // When we sign in we will deal out a cookie
            config.DefaultSignInScheme = "ClientCookie";
            // use this to check if we are allowed to do something.
            config.DefaultChallengeScheme = "OurServer";
        })
            .AddCookie("ClientCookie")
            .AddOAuth("OurServer", config => {
                config.ClientId = "client_id";
                config.ClientSecret = "client_secret";
                config.CallbackPath = "/oauth/callback";
                config.AuthorizationEndpoint = "https://localhost:44360/oauth/authorize";
                config.TokenEndpoint = "https://localhost:44360/oauth/token";
                config.SaveTokens = true;

                config.Events = new OAuthEvents()
                {
                    OnCreatingTicket = context =>
                    {
                        var accessToken = context.AccessToken;
                        var base64payload = accessToken.Split('.')[1];
                        var modified = base64payload.Replace(" ", "");
                        var bytes = Convert.FromBase64String(base64payload);
                        var jsonPayload = Encoding.UTF8.GetString(bytes);
                        var claims = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonPayload);

                        foreach (var claim in claims)
                        {
                            context.Identity.AddClaim(new Claim(claim.Key, claim.Value));
                        }

                        return Task.CompletedTask;
                    }
                };
            });

当它尝试从其base64表示转换字符串时,它将抛出一个:System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

这让我感到困惑,因为我正在学习一个关于YouTube的教程,据我所知,从跟踪它和查看github代码就可以看出它是相同的。假定无效的Base64字符串是:

代码语言:javascript
复制
eyJzdWIiOiJzb21lX2lkIiwiR3Jhbm55IjoiQ29va2llIiwibmJmIjoxNjEwMTYwMjE5LCJleHAiOjE2MTAyNDY2MTksImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDQzNjAvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo0NDM2MC8ifQ

这很奇怪,因为在https://www.base64decode.org/上正确地检查它会返回以下内容:

代码语言:javascript
复制
{"sub":"some_id","Granny":"Cookie","nbf":1610160219,"exp":1610246619,"iss":"http://localhost:44360/","aud":"http://localhost:44360/"}

它似乎是有效的,因为它与我在服务器端的控制器中设置的JWT令牌的声明和内容匹配。我到底做错了什么?我检查了处理令牌问题的其他地方,但没有看到任何无效字符,如-、+等。

编辑:

它的修复方法是执行以下操作,这要感谢LinkedListT提到它不是一个倍数a 4。

代码语言:javascript
复制
private string AddPaddingToBase64(string base64)
        {
            if(base64.Length % 4 == 0) 
                return base64;
            else
            {
                var builder = new StringBuilder(base64);
                builder.Append("=");
                return AddPaddingToBase64(builder.ToString());
            } 

        }

然后,我们首先解析字符串,让它通过该方法,然后将修改后的base64传递给转换器。这也是在3+专业开发年中,递归实际上比迭代更简单、更直接的第一次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-09 03:07:19

问题是您的base64字符串无效。

一个base64编码字符串的长度总是4的倍数。如果它不是4的倍数,那么=字符被追加直到它是。当值包含=字符时,表单?name=value的查询字符串出现问题(其中一些字符将被删除,我不记得确切的行为)。在执行base64解码之前,您可能可以附加正确的=字符数。https://stackoverflow.com/a/2925959/9936356

因此,您需要将'==‘附加到base64字符串中。也就是说。

代码语言:javascript
复制
Convert.FromBase64String("eyJzdWIiOiJzb21lX2lkIiwiR3Jhbm55IjoiQ29va2llIiwibmJmIjoxNjEwMTYwMjE5LCJleHAiOjE2MTAyNDY2MTksImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6NDQzNjAvIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo0NDM2MC8ifQ==");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65638895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档