从 ASP.NET Core 8 Web API 将自定义角色保存在 AspNetUserRoles Identity 表中

问题描述 投票:0回答:1

我正在尝试为基于 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
表中?任何类型的文档、代码示例或片段都将受到欢迎。我一直试图在互联网论坛上搜索类似的场景,但无济于事。任何形式的帮助将不胜感激。

感谢期待!

asp.net-core-webapi asp.net-core-identity user-roles asp.net-core-8
1个回答
0
投票

如果

AspNetRoles
中已存在角色, enter image description here

用户创建成功后,可以调用

_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
中的方法后:

enter image description here

如果

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));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.