У меня проблема с расшифровкой 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);
Кто-нибудь знает, что я делаю неправильно, или знает какое-нибудь лучшее решение для расшифровки куки?