使用 ASP.NET Core Web API Identity 注册用户时如何包含附加字段?

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

我的 ASP.NET Core Web API 项目中有一个自定义

User
类,它从
IdentityUser<Guid>
扩展了
Microsoft.AspNetCore.Identity

这是我的

User
课程的简化版本:

using Microsoft.AspNetCore.Identity;
using System;

namespace Quilt.Models.User
{
    public class UserEntity : IdentityUser<Guid>
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        private DateTime _birthday;

        public DateTime Birthday
        {
            get { return _birthday; }
            set
            {
                _birthday = DateTime.SpecifyKind(value, DateTimeKind.Utc);
            }
        }

        public string? Avatar { get; set; }
        public string Gender { get; set; }
    }
}

我使用 ASP.NET Core 8 Identity 进行用户身份验证,目前,在用户注册过程中,仅需要电子邮件和密码字段。但是,我希望用户在注册过程中提供其他信息,例如名字、姓氏、生日、头像(可为空)和性别。

这是我的

Program.cs
配置:

using System.Security.Claims;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Quilt.DataAccess.Data;
using Quilt.Models.User;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<QuiltDbContext>(options =>
    options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddAuthentication().AddBearerToken(IdentityConstants.BearerScheme);

builder.Services.AddAuthorizationBuilder();

builder.Services.AddDbContext<QuiltDbContext>(options => options.UseInMemoryDatabase("AppDb"));

builder.Services.AddIdentityCore<UserEntity>()
    .AddEntityFrameworkStores<QuiltDbContext>()
    .AddApiEndpoints();

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

var app = builder.Build();

app.MapGroup("/my-identity-api").MapIdentityApi<IdentityUser>();

app.MapGet("/", (ClaimsPrincipal user) => $"Hello {user.Identity!.Name}").RequireAuthorization();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.Run();

如何修改我的注册过程以包含

UserEntity
类中的这些附加字段?我是否应该自定义注册端点?如果是,如何在仍然利用 ASP.NET Core Identity 进行身份验证的同时实现这一目标?

任何帮助或指导将不胜感激。谢谢!

c# asp.net-core authorization asp.net-core-webapi asp.net-core-identity
1个回答
0
投票

您可以尝试以下方法:
创建RegisterDTO.cs

    public class RegisterDTO
    {
        public string Email { get; set; }
        public string Password { get; set; }    
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime Birthday { get; set; }
        public string? Avatar { get; set; }
        public string Gender { get; set; }
    }

创建一个

IdentityApiEndpointRouteBuilderExtensions.cs
并复制此链接中的所有代码https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Core/src/IdentityApiEndpointRouteBuilderExtensions.cs

将此文件中的所有

MapIdentityApi
替换为
MapCustomIdentityApi
。并添加修改继承到
where TUser: UserEntity, new()

将“/register”端点注册模型更改为

RegisterDTO

在此端点变化下

        var user = new TUser
        {
            Email = registration.Email,
            FirstName = registration.FirstName,
            LastName = registration.LastName,
            Birthday = registration. Birthday,
            Avatar = registration.Avatar,
            Gender = registration.Gender
        };

在program.cs中使用

app.MapCustomIdentityApi<UserEntity>();
代替。
测试结果

© www.soinside.com 2019 - 2024. All rights reserved.