.NET 8 Identity API端点如何让注册接口支持自定义用户属性?
ASP.NET Core Identity API 自定义注册请求体配置
问题背景
已在ApplicationUser中添加自定义属性(Name、Surname、Experience),数据库表结构生成正确,但默认的Identity注册端点仅接受邮箱和密码参数,无法传入自定义属性,且Username默认与邮箱绑定,无法单独设置。无需弃用新的Identity API端点,通过自定义注册逻辑即可解决。
解决方案步骤
1. 定义自定义注册请求DTO
创建包含所有需要字段的请求模型,用于接收前端传入的注册数据:
public class RegisterRequest { [Required] [EmailAddress] public string Email { get; set; } = string.Empty; [Required] [StringLength(100, MinimumLength = 6)] public string Password { get; set; } = string.Empty; public string? Username { get; set; } public string? Name { get; set; } public string? Surname { get; set; } public float Experience { get; set; } }
2. 自定义注册端点
在Program.cs中替代默认的注册端点(或在调用app.MapIdentityApi<ApplicationUser>()后覆盖该端点),使用UserManager手动处理用户创建逻辑:
// 替代默认注册端点,或在MapIdentityApi之后添加此自定义端点 app.MapPost("/register", async (RegisterRequest request, UserManager<ApplicationUser> userManager) => { // 初始化ApplicationUser实例,赋值自定义属性 var user = new ApplicationUser { UserName = string.IsNullOrEmpty(request.Username) ? request.Email : request.Username, Email = request.Email, Name = request.Name, Surname = request.Surname, Experience = request.Experience }; // 创建用户 var createResult = await userManager.CreateAsync(user, request.Password); if (!createResult.Succeeded) { return Results.BadRequest(createResult.Errors.Select(err => err.Description)); } // 可选:生成邮箱确认令牌(若启用邮箱验证) // var confirmationToken = await userManager.GenerateEmailConfirmationTokenAsync(user); // 返回注册成功结果,可按需返回用户ID、令牌等信息 return Results.Ok(new { UserId = user.Id, Message = "注册成功" }); }) .WithName("CustomRegister") .WithOpenApi();
3. 保留其他默认Identity端点
其他如登录、刷新令牌、获取用户信息等端点,仍可继续使用app.MapIdentityApi<ApplicationUser>()提供的默认实现,无需全部重写。
说明
默认Identity API的注册端点使用内置请求模型,仅包含邮箱和密码字段,且强制将Username设为邮箱值。通过自定义注册端点,可完全控制请求参数和用户属性赋值逻辑,无需弃用新的Identity API体系。
内容的提问来源于stack exchange,提问作者Piotr Apriasz
相关产品推荐
相关产品推荐

