sql-server - 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 创建用户时,它工作正常。
解决方案
这是一个如何为用户播种的示例:
在您的 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();
推荐阅读
- java - 我的 customAdapter 或 Activity.java 有什么问题?运行应用程序时我的 ListView 没有显示它的元素
- android - 不活动通知
- java - 使用邮递员解析和映射 json
- google-app-engine - 并行调用 Google App Engine 上的同一函数(并发)
- regex - 为什么这些按位正则表达式在 golang 中匹配不同?
- jquery - 如何将 jQuery JS 轮播代码包含到 React 组件中
- android - 我不明白如何在我的 Interactor 类中注入 Retrofit 对象
- gensim - Gensim word2vec 模型中的跟踪损失和嵌入
- php - 如何在 PHP 中使用 foreach 循环在多个复选框中设置选定属性?
- ios - 将变量分配给传入视图控制器的正确方法