首页 > 解决方案 > ASP.NET Core 加密和 SQL Server

问题描述

我正在为我的系统创建一个默认用户。但是我是通过 SQL Server 数据库创建的。

我使用 ASP.NET Core 和 Entity Framework 来处理登录,默认情况下 Entity Framework 创建一个名为AspNetUsers; 这个表有一列叫做PasswordHash,我相信使用的加密是哈希类型的。

我正在通过数据库输入此用户的密码,如下所示:

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'

但是密码栏在日文中出现了奇怪的字符,如下图:

在此处输入图像描述

最大的问题,当我登录 ASP.NET Core 时,只有密码无效。

我该怎么做才能绕过这个?

观察:当我通过 ASP.NET Core 创建用户时,它工作正常。

标签: sql-serverentity-frameworkrazorasp.net-coreasp.net-identity

解决方案


这是一个如何为用户播种的示例:

在您的 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));
            }
        }
    }

种子用户:

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。

然后只需简单地从 Startup.cs Configure 方法调用 Seed 方法:

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

推荐阅读