我正在尝试为基于 Angular 和 .NET Core 的 Web 应用程序开发后端 ASP.NET Core 8 Web API。我已使用代码优先迁移在 SQL Server 数据库中创建了 Identity 表。
在初始迁移过程中,
AspNetRoles
表将填充角色“摄影师”、“画家”、“音乐家”。我从前端发送以下数据以保存在数据库中以供用户注册过程使用:
Email
FullName
Password
SubscriptionType
Role
典型的
POST
用户注册请求流程是这样的:
{
"email": "[email protected]",
"fullName": "PGC PC",
"password": "Passw0rd!",
"confirmPassword": "Passw0rd!",
"subscriptionType": 0,
"role":"Photographer"
}
我可以很好地保存我的
AspNetUsers
表中的前 4 个字段。我想做的是将角色数据保存在带有 AspNetUserRoles
的 userID
表中。我无法做到这一点。我对 ASP.NET Core Identity 的了解不是很深刻,这就是我苦苦挣扎的原因。
我创建了一个
RegisterViewModel
类,如下所示:
public class RegisterViewModel
{
[Required]
[EmailAddress]
public string Email { get; set; } = string.Empty;
[Required]
public string FullName { get; set; } = string.Empty;
[Required]
public string Password { get; set; } = string.Empty;
[Required]
public string ConfirmPassword { get; set; } = string.Empty;
[Required]
public int SubscriptionType { get; set; } = 0;
[Required]
public string Role { get; set; } = string.Empty;
}
我在auth Web API控制器文件中的注册方法如下:
[HttpPost("register")]
//api/auth/register
public async Task<ActionResult<string>> Register(RegisterViewModel viewModel)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
AppUser user = new AppUser
{
Email = viewModel.Email,
FullName = viewModel.FullName,
SubscriptionType = viewModel.SubscriptionType,
UserName = viewModel.Email
};
IdentityResult result = await _userManager.CreateAsync(user, viewModel.Password);
if (!result.Succeeded)
{
return BadRequest(result.Errors);
}
return Ok(new AuthResponseViewModel
{
Result = true,
Message = "Accout created"
});
}
其中
AppUser
定义为:
public class AppUser : IdentityUser
{
public string FullName { get; set; } = string.Empty;
public int SubscriptionType { get; set; }
}
和
AuthResponseViewModel
班级是:
public class AuthResponseViewModel
{
public string Token { get; set; } = string.Empty;
public bool Result { get; set; }
public string Message { get; set; } = string.Empty;
}
您能否告诉我在何处以及如何添加/编辑什么代码,以便我可以将角色数据(即摄影师、画家、音乐家等)与
AspNetUserRoles
值一起保存在 userID
表中?任何类型的文档、代码示例或片段都将受到欢迎。我一直试图在互联网论坛上搜索类似的场景,但无济于事。任何形式的帮助将不胜感激。
感谢期待!
如果
AspNetRoles
中已存在角色,
用户创建成功后,可以调用
_userManager.AddToRoleAsync()
方法中的register
方法将用户添加到指定角色中。
例如:
IdentityResult createResult = await _userManager.CreateAsync(user, viewModel.Password);
if (!createResult.Succeeded)
{
return BadRequest(createResult.Errors);
}
IdentityResult roleResult = await _userManager.AddToRoleAsync(user, viewModel.Role);
if (!roleResult.Succeeded)
{
return BadRequest(roleResult.Errors);
}
调用我的
AspNetUserRoles
中的方法后:
如果
AspNetRoles
表中不存在该角色,可以通过SeedRolesAsync
方法创建:
public static async Task SeedRolesAsync(RoleManager<IdentityRole> roleManager)
{
string[] roleNames = { "Photographer", "Painter", "Musician" };
foreach (var roleName in roleNames)
{
if (!await roleManager.RoleExistsAsync(roleName))
{
await roleManager.CreateAsync(new IdentityRole(roleName));
}
}
}