如何自定义“.NET 8 Identity”路由 - MapIdentityApi

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

我使用 .MapIdentityApi() 从 .NET 8 添加了新的身份端点。 如何扩展“/register”和“/login”端点以允许传递用户名?当我注册用户时,用户名被设置为电子邮件。

我使用其他字段扩展了 IdentityUser,并将这些类迁移到我的 MySQL 数据库。效果很好。所有端点保持不变。

c# .net asp.net-identity .net-8.0
2个回答
0
投票

这就是我所做的。 我拿了源码@ 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>(); 

希望你能从那里拿走它并拯救世界!


0
投票

必须有更好的方法...但是,对 @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,
            };

        }

    }

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