我使用 .MapIdentityApi() 从 .NET 8 添加了新的身份端点。 如何扩展“/register”和“/login”端点以允许传递用户名?当我注册用户时,用户名被设置为电子邮件。
我使用其他字段扩展了 IdentityUser,并将这些类迁移到我的 MySQL 数据库。效果很好。所有端点保持不变。
这就是我所做的。 我拿了源码@ https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Core/src/IdentityApiEndpointRouteBuilderExtensions.cs
我复制了它并将其放入我的 .NET 8 Api 应用程序中。 然后我改变了路线:
public static IEndpointConventionBuilder MapIdentityApi<TUser>(this IEndpointRouteBuilder endpoints)
到
public static IEndpointConventionBuilder MapCustomIdentityApi<TUser>(this IEndpointRouteBuilder endpoints)
您需要更新代码中的一些对类名称的引用。基于您保留的端点。我把注册机去掉了,这是一个,另一个是确认邮件
然后我在其中添加/删除/自定义端点。
然后在 Program.cs 中我调用:
app.MapCustomIdentityApi<IdentityUser>();
希望你能从那里拿走它并拯救世界!
必须有更好的方法...但是,对 @user1579943 的评论进行了快速简短的修改,并提供了一些额外的细节。
从 IdentityUser 子类化您的自定义用户
public class MyUser : IdentityUser
{
public string? Name { get; set; } = "";
public string? Street { get; set; } = "";
public string? City { get; set; } = "";
public string? State { get; set; } = "";
public string? Zip { get; set; } = "";
public string? Phone { get; set; } = "";
}
创建匹配的 Dto
public record CreateUserDto(
string Email,
string Password,
string Name,
string Street,
string City,
string State,
string Zip,
[Required]
string Phone,
);
破解 IdentityApiEndpointRouteBuilderExtensions 以匹配。
public static class IdentityApiEndpointRouteBuilderExtensions
{
private static readonly EmailAddressAttribute _emailAddressAttribute = new();
public static IEndpointConventionBuilder MapCustomIdentityApi<TUser>(this IEndpointRouteBuilder endpoints)
where TUser : MyUser, new()
{
.....
routeGroup.MapPost("/register", async Task<Results<Ok, ValidationProblem>>
([FromBody] CreateUserDto registration, HttpContext context, [FromServices] IServiceProvider sp) =>
{
.....
var user = new TUser
{
Name = registration.Name,
Street = registration.Street,
City = registration.City,
State = registration.State,
Zip = registration.Zip,
Phone = registration.Phone,
};
}
}
....
}