). Поэтому это может измениться в будущих версиях.
те рассмотрим общеизвестный сценарий ASP.NET Core. Сначала добавим промежуточное ПО:
public void Configure(IApplicationBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "MyCookie",
CookieName = "MyCookie",
LoginPath = new PathString("/Home/Login/"),
AccessDeniedPath = new PathString("/Home/AccessDenied/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
//...
}
Затем сериализуйте принципал:
await HttpContext.Authentication.SignInAsync("MyCookie", principal);
После этих двух вызовов зашифрованный файл cookie будет храниться на стороне клиента. Вы можете увидеть куки (в моем случае это были фрагменты) в любом браузере devtools:
Работать с куки-файлами из кода приложения не проблема (и не вопрос).
Мой вопрос:как расшифровать куки вне приложения? Я думаю, для этого нужен закрытый ключ, как его получить?
Я проверилдокументы и нашел только общие слова:
Это создаст зашифрованный файл cookie и добавит его в текущий ответ. AuthenticationScheme, указанный при настройке, также должен использоваться при вызове SignInAsync.
Под крышками используется шифрование системы защиты данных ASP.NET. Если вы используете хостинг на нескольких компьютерах, с балансировкой нагрузки или с помощью веб-фермы, вам необходимо настроить защиту данных, чтобы использовать один и тот же набор ключей и идентификатор приложения.
Итак, возможно ли расшифровать куки аутентификации, и если да, то как?
ОБНОВЛЕНИЕ № 1: Основано на Роне Сотличный ответ и комментарииЯ закончил с кодом:
public class Startup
{
//constructor is omitted...
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection().PersistKeysToFileSystem(
new DirectoryInfo(@"C:\temp-keys\"));
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "MyCookie",
CookieName = "MyCookie",
LoginPath = new PathString("/Home/Index/"),
AccessDeniedPath = new PathString("/Home/AccessDenied/"),
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}
}
public class HomeController : Controller
{
public async Task<IActionResult> Index()
{
await HttpContext.Authentication.SignInAsync("MyCookie", new ClaimsPrincipal());
return View();
}
public IActionResult DecryptCookie()
{
var provider = DataProtectionProvider.Create(new DirectoryInfo(@"C:\temp-keys\"));
string cookieValue = HttpContext.Request.Cookies["MyCookie"];
var dataProtector = provider.CreateProtector(
typeof(CookieAuthenticationMiddleware).FullName, "MyCookie", "v2");
UTF8Encoding specialUtf8Encoding = new UTF8Encoding(false, true);
byte[] protectedBytes = Base64UrlTextEncoder.Decode(cookieValue);
byte[] plainBytes = dataProtector.Unprotect(protectedBytes);
string plainText = specialUtf8Encoding.GetString(plainBytes);
return Content(plainText);
}
}
К сожалению, этот код всегда выдает исключение наUnprotect
вызов метода:
CryptographicException в Microsoft.AspNetCore.DataProtection.dll: дополнительная информация: полезная нагрузка была недопустимой.
Я тестировал разные варианты этого кода на нескольких машинах без положительного результата. Возможно я ошибся, но где?
ОБНОВЛЕНИЕ № 2: Моя ошибка былаDataProtectionProvider
не был установлен вUseCookieAuthentication
, Еще раз спасибо @RonC.