TLDR: Как я могу получить зашифрованный файл cookie аутентификации Asp.Net Core 2.2, понятный устаревшему приложению Web Forms?
ДР:
Я нахожусь в ситуации, когда я пытаюсь заставить устаревший сайт веб-форм (aspx) использовать cookie-файл аутентификации, установленный в браузере, новым и блестящим .NET Core 2.2 MVC-сайтом. Соответствующее приложение Web Forms написано на Visual Basic , приложение .Net Core на C # . Все размещено в IIS / IIS Express (из Visual Studio).
Кажется, что файл cookie настроен нормально, и для упрощения (на данный момент) все объекты размещены на одном компьютере (My Windows 10 Professional Edition Dell XPS). Ключ шифрования / машина для шифрования cookie находится в четко определенном месте на диске. Приложение .Net Core (на данный момент назовем его «Порталом авторизации») - это в основном фронт для AWS Cognito.
В Auth Portal файл cookie настроен так же, как в Startup.cs :
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
var keyDir = Configuration["AuthSettings:CookieEncryptionKeyDir"];
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(keyDir))
.SetApplicationName(Configuration["ApplicationName"]);
services.AddCognitoIdentity();
services.AddSingleton(typeof(IAmazonCognitoIdentityProvider),
_ => new AmazonCognitoIdentityProviderClient(RegionEndpoint.APSoutheast2)); // Oh no you know I'm using Sydney!
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services
.ConfigureApplicationCookie(options =>
{
var parseSucceeded = int.TryParse(Configuration["AuthSettings:CookieExpiryHours"],
out var cookieExpiry);
if (!parseSucceeded) _log.LogError("Failed to parse from configuration auth cookie expiry value");
parseSucceeded = bool.TryParse(Configuration["AuthSettings:SSLCookieOnly"], out var secureCookieOnly);
var securePolicy = secureCookieOnly ? CookieSecurePolicy.Always : CookieSecurePolicy.SameAsRequest;
if (!parseSucceeded) _log.LogError("Failed to parse from configuration cookie security policy");
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromHours(cookieExpiry);
options.SlidingExpiration = true;
options.LoginPath = Configuration["AuthSettings:LoginUrl"];
options.LogoutPath = Configuration["AuthSettings:LogoutUrl"];
options.Cookie.Domain = Configuration["AuthSettings:TrustedDomains"];
options.Cookie.Name = Configuration["AuthSettings:CookieName"];
options.Cookie.SecurePolicy = securePolicy;
});
services
.Configure<SecurityStampValidatorOptions>(o =>
{
o.ValidationInterval = TimeSpan.FromHours(1);
});
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardLimit = 2;
options.ForwardedForHeaderName = "X-Forwarded-For-Auth-Portal";
});
В приложении Web Forms я заменяю существующую аутентификацию sql по умолчанию. Вот где онлайн-ресурсы, кажется, иссякают. Я могу сделать пользовательское членство провайдера, что я сделал легко. Но он (по понятным причинам) не понимает существующий файл cookie из коробки, даже когда я задаю имя файла cookie в настройках авторизации форм
<authentication mode="Forms">
<forms timeout="60" name="my.sso.cookie" requireSSL="false" path="/" />
</authentication>
<membership defaultProvider="CognitoMembershipProvider" userIsOnlineTimeWindow="60">
<providers>
<clear />
<add name="CognitoMembershipProvider" type="TheOldWebFormsApp.Authentication.CognitoMembershipProvider" applicationName="MyWebForms" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="true" requiresUniqueEmail="false" passwordFormat="Clear" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="3" maxInvalidPasswordAttempts="8" />
</providers>
</membership>
Как я обнаружил, он просто перезапишет существующий файл cookie, который я предполагаю, потому что он считает и непонятный файл cookie несуществующим.
Полагаю, это очень длинный и сложный способ узнать, как заставить старое приложение веб-форм принимать и дешифровать cookie-файл Auth Portal?
Ура ~!