Проблема с расшифровкой cookie .AspNetCore.Bearer в приложении MVC5 - PullRequest
0 голосов
/ 09 июля 2019

У меня проблема с расшифровкой cookie, которая была создана во время входа в приложение ASP .NET Core и содержит Json Web Token в качестве заявки. Я хочу расшифровать куки-файл из приложения, разработанного в MVC5 (.NET Framework 4.5.2), и использовать JWT для получения некоторых значений. К сожалению, я получил сообщение об ошибке «Произошла ошибка во время криптографической операции».

Я уже пытался расшифровать его, но всегда получал эту ошибку. Код выглядит следующим образом:

Код входа в основное приложение:

        public async Task<bool> LoginAsync(LoginDto loginDto)
        {
            await LogoutAsync();

            var tokenHandler = new JwtSecurityTokenHandler();
            var settings = _jwtSettingsFactory.CreateTokenValidationParameters();

            // Retrieve principal from JWT
            var jwtToken = await _accountService.Login(loginDto);
            var principal = tokenHandler.ValidateToken(jwtToken.Token, settings, out var validatedToken);

            // Cast needed for accessing claims property
            var identity = principal.Identity as ClaimsIdentity;

            // parse jwt token to get all claims
            var securityToken = tokenHandler.ReadToken(jwtToken.Token) as JwtSecurityToken;

            var extraClaims = securityToken.Claims.Where(c => !identity.Claims.Any(x => x.Type == c.Type)).ToList();
            extraClaims.Add(new Claim("jwt", jwtToken.Token));
            identity.AddClaims(extraClaims);

            var authenticationProperties = new AuthenticationProperties()
            {
                IssuedUtc = Convert.ToInt64(identity.Claims.Single(c => c.Type == JwtRegisteredClaimNames.Iat).Value).ToUnixEpochDate(),
                ExpiresUtc = Convert.ToInt64(identity.Claims.Single(c => c.Type == JwtRegisteredClaimNames.Exp).Value).ToUnixEpochDate(),
                IsPersistent = true
            };

            await _httpContext.SignInAsync(JwtBearerDefaults.AuthenticationScheme, principal, authenticationProperties);

            return identity.IsAuthenticated;
        }

Расшифровка в промежуточном программном обеспечении .NET Framework:

        public class MachineKeyProtector : IDataProtector
        {
            private string[] _cookiePurpose = {
                typeof(CookieAuthenticationMiddleware).FullName,
                "Bearer",
                "v2"
            };

            public byte[] Protect(byte[] userData)
            {
                return System.Web.Security.MachineKey.Protect(userData, _cookiePurpose);
            }

            public byte[] Unprotect(byte[] protectedData)
            {
                return System.Web.Security.MachineKey.Unprotect(protectedData, _cookiePurpose);
            }
        }

1-я попытка:

            var cookie = context.Request.Cookies.Get(".AspNetCore.Bearer");
            var ticket = cookie.Value;
            UTF8Encoding specialUtf8Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
            var encoder = new Base64UrlTextEncoder();
            byte[] protectedBytes = encoder.Decode(ticket);
            var dataProtector = new MachineKeyProtector();
            var plainBytes = dataProtector.Unprotect(protectedBytes);
            string plainText = specialUtf8Encoding.GetString(plainBytes);

2-я попытка:

            var cookie = context.Request.Cookies.Get(".AspNetCore.Bearer");
            var ticket = cookie.Value;
            ticket = ticket.Replace('-', '+').Replace('_', '/');
            var padding = 3 - ((ticket.Length + 3) % 4);
            if (padding != 0)
            { ticket = ticket + new string('=', padding); }
            var secureDataFormat = new TicketDataFormat(new MachineKeyProtector());
            var decoded = secureDataFormat.Unprotect(ticket);

Кто-нибудь знает, что я делаю неправильно, или знает какое-нибудь лучшее решение для расшифровки куки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...