Добавление ключа шифрования пароля в ASP NET Core Identity

В ASP .NET Webforms MachineKey (guid) был важной частью безопасности базы данных, а также безопасности приложений. Он использовался в качестве ключа шифрования для паролей для проверки подлинности с помощью форм, поэтому при изменении ключа компьютера существующие пароли больше не распознаются. Это обеспечило некоторый уровень безопасности при связывании хранилища паролей в базе данных с токеном на веб-сервере. Если было несколько веб-серверов, использующих одно хранилище аутентификации базы данных, было необходимо, чтобы все они имели один и тот же идентификатор машины.

В .NET Core MVC теперь есть несколько сервисов, которые мы объявляем в Startup.cs:

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
                options => {
                    options.ExpireTimeSpan = new TimeSpan(0, 45, 0);
                    options.LoginPath = new PathString("/Account/Login");
                    options.AccessDeniedPath = new PathString("/Account/AccessDenied");
                }
            );

        services.AddDataProtection()
            .SetApplicationName("MyApplicationName")
            .PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"C:\server_config\my-app-keys"));

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

В этой статье изоляция рассматривается как одно из ключевых требований API: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-3.0

и у этого есть простой пример использования «Целевой строки» для обеспечения изоляции шифрования между разными логическими хранилищами: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/using-data-protection?view=aspnetcore-3.0

однако я не могу связать это вместе, чтобы связать шифрование паролей в .NET Core с определенным ключом.

Что мне не хватает в отношении установки определенного уникального ключа шифрования для стандартной инъекции Asp Net Identity, который будет использоваться для паролей, хранящихся в базе данных?


person Ben McIntyre    schedule 25.11.2019    source источник
comment
Нет, на самом деле это вопрос, который я использовал, чтобы настроить вещи так, как они сейчас (т.е. работают, но не совсем так, как я хочу). Сижу на этом около 9 месяцев, как раз сейчас на стадии доводки.   -  person Ben McIntyre    schedule 25.11.2019
comment
На самом деле, возможно, ответ со ссылкой на github.com/synercoder/FormsAuthentication может быть решением. Я надеялся, что там будет что-то встроенное. Это существенное изменение по сравнению со старым поведением, и я много гуглил, я действительно ожидал найти что-то к настоящему времени. Задавать этот вопрос о SO - последнее средство, я надеюсь найти гуру в этой области.   -  person Ben McIntyre    schedule 25.11.2019


Ответы (1)


Если я правильно помню, вы можете сделать это следующим образом:

using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Microsoft.AspNet.DataProtection.Repositories;

namespace MySpace
{
    public class MyXmlRepository : IXmlRepository
    {
        public MyXmlRepository()
        {
            // Whatever I wanted injected in.
        }

        public IReadOnlyCollection<XElement> GetAllElements()
        {
            return null;
        }

        public void StoreElement(XElement element, string friendlyName)
        {
            // Persist something
        }
    }
}


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

person RubbleFord    schedule 25.11.2019
comment
Спасибо, но речь идет именно о настройке ключа шифрования для использования удостоверением ASP NET. Я не хочу кататься самостоятельно. - person Ben McIntyre; 25.11.2019