ASP.NET Core шифрование и SQL Server - PullRequest
       34

ASP.NET Core шифрование и SQL Server

0 голосов
/ 27 ноября 2018

Я создаю пользователя по умолчанию для моей системы.Однако я создаю базу данных SQL Server.

Я использую ASP.NET Core и Entity Framework для обработки входов в систему, по умолчанию Entity Framework создает таблицу с именем AspNetUsers;в этой таблице есть столбец с именем PasswordHash, я полагаю, что используемое шифрование относится к типу Hash.

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

DECLARE @HashThis nvarchar(4000);  
SET @HashThis = CONVERT(nvarchar(4000),'Administrador');  

SELECT HASHBYTES('SHA1', @HashThis)

UPDATE AspNetUsers 
SET PasswordHash = HASHBYTES('SHA1', @HashThis), 
    SecurityStamp = '0b12450e-016d-4cd6-af7b-fa6d2198586f', 
    ConcurrencyStamp = 'a63a5236-4020-4f69-93b1-9f077ba014cd', 
    UserName = 'administrador@administrador.com.br'

Но столбец пароля получает странные символы на японском языке, он следует за изображением:

enter image description here

Самая большая проблема, и когда я захожу в ASP.NET Core,только пароль становится недействительным.

Как я могу обойти это?

Наблюдение: когда я создаю пользователя через ASP.NET Core, он работает нормально.

1 Ответ

0 голосов
/ 28 ноября 2018

Вот один пример того, как вы можете заполнить пользователя:

В вашем SecurityDbContext вы можете создать следующие методы (я добавил SeedRoles, если они вам нужны):

 public static async Task Seed(IServiceProvider serviceProvider)
    {
        await SeedRoles(serviceProvider);
        await SeedUsers(serviceProvider);
    }

Семенные роли:

public static async Task SeedRoles(IServiceProvider serviceProvider)
    {
        RoleManager<ApplicationRole> roleManager = serviceProvider.GetRequiredService<RoleManager<ApplicationRole>>();

        string[] roles = ...;

        foreach(var role in roles)
        {
            ApplicationRole appRole = await roleManager.FindByNameAsync(role);
            if (appRole == null)
            {
                await roleManager.CreateAsync(new ApplicationRole(role));
            }
        }
    }

Пользователь Seed:

public static async Task SeedUser(IServiceProvider serviceProvider, UserManager<ApplicationUser> userManager,  string email, string password, string roleName = "")
    {
        string userName = roleName;

        ApplicationUser user = await userManager.FindByNameAsync(userName);

        if (user == null)
        {
            // Create user account if it doesn't exist
            user = new ApplicationUser
            {
                UserName = userName,
                Email = email
            };

            IdentityResult result = await userManager.CreateAsync(user, password);

            // Assign role to the user
            if (result.Succeeded)
            {
                user = await userManager.FindByNameAsync(userName);
            }

        }

        if (user != null && roleName.Length > 0)
        {
            await userManager.AddToRoleAsync(user, roleName);
        }
    }

Из метода SeedUsers просто вызывайте SeedUser столько раз, сколько вам нужно.

А затем просто вызывайте метод Seed изStartup.cs Сконфигурировать метод:

SecurityDbContextSeed.Seed(app.ApplicationServices).Wait();
...