Использование ASP.Net Core 2.2 Auth Cookies на старом сайте .Net Web Forms (aspx) для единого входа - PullRequest
0 голосов
/ 16 апреля 2019

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?

Ура ~!

1 Ответ

1 голос
/ 16 апреля 2019

К сожалению, это невозможно.ASP.NET Core использует совершенно другую методологию шифрования файлов cookie, чем ASP.NET.Последний основан на «ключе машины», но в ASP.NET Core используются поставщики защиты данных и набор ключей.Эти два принципиально несовместимы, поэтому, даже если вы можете «поделиться» cookie-файлом, чтобы каждый его видел, один не сможет расшифровать cookie-файл, установленный другим.

Это равно можно успешно делиться файлами cookie с ASP.NET MVC 5, но это потому, что он использует OWIN, а средства защиты данных совместимы с OWIN.Таким образом, несмотря на то, что MVC 5 также использует машинные ключи изначально, его можно использовать для защиты данных, а затем он может совместно использовать то же хранилище ключей защиты данных с сайтом ASP.NET Core.Однако веб-формы не поддерживают OWIN, поэтому этого нельзя достичь.Короче говоря, это полный запрет.

Альтернативой, возможно, является использование централизованного поставщика удостоверений, такого как Identity Server, Auth0, Azure AD и т. Д. При таком решении нет необходимостиделиться куки, поскольку каждый сайт авторизуется независимо с провайдером, но можно использовать одну и ту же учетную запись пользователя.Фактический вход в систему происходит у провайдера идентификации, затем каждому сайту, авторизованному с этим провайдером идентификации, присваивается идентификатор от провайдера идентификации, а затем он может устанавливать свои собственные куки-файлы или что-то подобное.

...