Общие файлы cookie .Net Core для локальной или автономной разработки

#c# #authentication #cookies #.net-core

#c# #аутентификация #файлы cookie #.net-core

Вопрос:

Я оцениваю использование общих файлов cookie для набора.Приложения Net core. Было бы одно центральное приложение, которое было бы настроено для выполнения аутентификации SAML в нашем корпоративном Okta и установило бы соответствующий файл cookie. После аутентификации пользователи будут использовать страницу каталога для ссылки на любое клиентское приложение, которое они захотят. Клиентские приложения смогут считывать файлы cookie, но не смогут самостоятельно выполнять цикл аутентификации SAML.

Как центральное, так и клиентское приложения будут иметь методы запуска, подобные показанным ниже.

         public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddDataProtection()
                .SetApplicationName("SharedCookieApps");

            services
                .AddAuthentication("Identity.Application")
                .AddCookie("Identity.Application", options =>
                {
                    options.Cookie.Name = ".AspNet.SharedCookie";
                });
            ...
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            ...
            app.UseAuthentication();
            app.UseAuthorization();
            ...
        }
  

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

Кстати, если по какой-то причине совместное использование таких файлов cookie является плохой идеей, мне было бы интересно услышать, почему.

Если это имеет значение, клиентские приложения будут представлять собой смесь .Net Core 2 и 3, Angular и Blazor.

Ответ №1:

При использовании ASP.NET Идентификатор ядра, ключи защиты данных и название приложения должны быть общими для всех приложений. В следующих примерах методу PersistKeysToFileSystem предоставляется общее хранилище ключей.Это может помочь.

Изменение при запуске.Файл конфигурационных сервисов :

 services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
});  

Файл cookie для аутентификации использует HttpRequest.База данных пути в качестве файла cookie по умолчанию.Path. Если файл cookie приложения должен быть общим для разных базовых путей, путь должен быть переопределен:

 services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
    options.Cookie.Path = "/";
});  

Для обмена файлами cookie аутентификации между ASP.NET 4.x и ASP.NET Ссылка на основные приложения: https://learn.microsoft.com/en-us/aspnet/core/security/cookie-sharing?view=aspnetcore-3.1#share-authentication-cookies-between-aspnet-4x-and-aspnet-core-apps

Ответ №2:

После некоторой дополнительной работы я придумал вариант, который позволит использовать локальную / автономную разработку. Для этого не требуется доступ к нашему единому входу, и это позволяет разработчикам моделировать любые утверждения, которые они хотят для тестирования.

При запуске в dev я launchSettings.json настроил использование проверки подлинности WindowsAuthentication и запретил анонимную проверку подлинности.

Затем в dev мы используем IClaimsTransformation реализацию для настройки утверждений.

         public void ConfigureServices(IServiceCollection services)
        {
            ...

            if (Environment.IsDevelopment())
            {
                services.AddAuthentication(IISDefaults.AuthenticationScheme);
                services.AddScoped<IClaimsTransformation, DevClaimsTransformer>();
            }

            services.AddDataProtection()
                            .SetApplicationName("SharedCookieApps");

            services
                .AddAuthentication("Identity.Application")
                .AddCookie("Identity.Application", options =>
                {
                    options.Cookie.Name = ".AspNet.SharedCookie";
                });
        }
  

Затем преобразователь утверждений просто считывает из файла json, который определяет утверждения по типу.

   public class DevClaimsTransformer : IClaimsTransformation
    {
        private static Dictionary<string, List<DevClaim>> devRoleClaims;

        public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {
            if (devRoleClaims == null)
            {
                devRoleClaims =
                    JsonSerializer.Deserialize<Dictionary<string, List<DevClaim>>>(
                        File.ReadAllText("dev-claims.json"));
            }

            var identity = (ClaimsIdentity)(principal?.Identity ?? throw new ArgumentNullException(nameof(principal)));
            if (identity.IsAuthenticated)
            {
                foreach (var rc in devRoleClaims)
                {
                    foreach (var c in rc.Value)
                    {
                        if (c.Active)
                        {
                            identity.AddClaim(new Claim(rc.Key, c.Claim));
                        }
                    }
                }
            }

            return new ClaimsPrincipal(identity);
        }

        private class DevClaim
        {
            public string Claim { get; set; }

            public bool Active { get; set; }
        }
    }