我正在尝试学习 .NET8,并且正在构建我的第一个 API。在我的项目中,我使用 Identity.EntityFrameworkCore 来处理用户相关的内容。
我创建了自定义 User 类,以便为用户添加一些属性,这是我的类。
using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations;
namespace Blog.Models.Entities
{
public class User : IdentityUser
{
[DataType(DataType.DateTime)]
public DateTime? BirthDate { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }
public byte[]? ProfilePicture { get; set; }
public virtual ICollection<Article>? blogs { get; set; }
}
}
我完成了所需的配置,并且可以访问默认端点 /login、/register... 这很完美,但是当我尝试注册用户时,我只能在请求正文中提供电子邮件和密码,但我想要为了能够提供我在自定义用户类中创建的其他属性,并为此创建了自定义注册端点
[HttpPost("register")]
public async Task<IActionResult> Register(RegisterUserDto input)
{
var user = new User()
{
FirstName = input.FirstName,
LastName = input.LastName,
BirthDate = input.BirthDate,
Email = input.Email,
UserName = input.UserName,
};
var result = await _userManager.CreateAsync(user, input.PasswordHash);
string message = string.Empty;
if (result.Succeeded)
return Ok("User created successfully");
return BadRequest("Error occured");
}
我得到了预期的结果。然而我的问题是,现在我确实有 2 个注册端点,一个是由 Identity 提供的,另一个是我创建的。我可以删除
builder.Services.AddIdentityCore<User>()
.AddEntityFrameworkStores<AppDbContext>()
.AddApiEndpoints();
和
app.MapIdentityApi<User>();
来自 Program.cs, 但这也将摆脱我想保留的其他端点,例如 /login、/refresh、/forgotPassword...。 所以我的问题是,是否有可能只摆脱默认的注册方法,同时保留其他方法?
听起来您在 .NET 8 API 和自定义身份系统方面取得了巨大进展。要回答您的问题,是的,可以保留默认端点,例如 /登录 , /刷新 , 和 /忘记密码 同时删除默认注册端点。
实现此目标的一种方法是自定义您的身份服务 程序.cs 文件。您可以覆盖默认注册行为,而不是删除整个身份设置。您可以采取以下一般方法:
删除默认注册端点:您可以通过不调用来完成此操作 app.MapIdentityApi() 或者通过自定义端点映射。
创建您自己的注册端点:您已经设置了自定义注册端点,这太棒了!只需确保它在您的控制器中正确配置即可。
使用中间件删除默认注册端点:如果您想保留默认身份端点但只删除注册端点,您可以创建一个自定义中间件或过滤器来拦截对注册端点的请求并返回 404 或其他响应.
这是一个如何实现这一点的简单示例:
app.Use(异步(上下文,下一个)=> { if (context.Request.Path.StartsWithSegments("/register")) { context.Response.StatusCode = StatusCodes.Status404NotFound; // 或任何其他响应 返回; } 等待下一个(); });
该中间件检查请求路径是否以 /登记 并返回 404 状态代码,有效禁用默认注册端点,同时允许其他身份端点正常运行。
通过执行这些步骤,您应该能够保留其他身份端点,同时删除默认注册端点。