如何在.NET Core 8中自定义IdentityUser模型

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

我正在尝试在 NET 8 中创建一个身份验证模块。我能够创建一个可以轻松接收令牌和身份验证的系统。

public class DbContext : IdentityDbContext<IdentityUser>
builder.Services.AddIdentityApiEndpoints<IdentityUser>()
    .AddEntityFrameworkStores<DbContext>();

我如何管理这个端点?我没有创建任何控制器。当我要注册时,请求模型是这样的

{
  "email": "string",
  "password": "string"
}

我想添加一些个人信息,例如地址、性别、名字、姓氏等。 我可以自定义这个 IdentityModel 吗?

另外一个问题,

当我登录时,我看到这个回复

{
  "tokenType": "Bearer",
  "accessToken": "\\an access token",
  "expiresIn": 3600,
  "refreshToken": "\\an refresh token"
}

如何更改 expiresIn 属性的值?默认值为 3600。

我期望轻松定制这个模型,但是当我在互联网上搜索解决方案时,我看到每个程序员都从头开始创建身份验证服务。除了这个解决方案,我想知道我可以自定义默认模型吗?

c# .net rest entity-framework authentication
1个回答
0
投票

我如何管理这个端点?我没有创建任何控制器。什么时候 我要注册,请求模型是这样的

好吧,你可以引入你自己的 viewModel 来做到这一点。您只需创建具有两个属性的模型,然后使用该 viewModel 定义控制器。下面我们就来看看吧:

视图模型:

public class RegisterModel
{
    [Required]
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }
}

控制器:

现在,使用

RegisterModel
作为您在调用此端点时要传递的控制器签名。让我们来看看实践吧:

[ApiController]
[Route("api/[controller]")]
public class RegisterController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;

    public RegisterController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

    [HttpPost("register")]
    public async Task<IActionResult> Register([FromBody] RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser
            {
                UserName = model.Email,
                Email = model.Email
            };

            var result = await _userManager.CreateAsync(user, model.Password);

            if (result.Succeeded)
            {
                //If the User registration successful
                //Here You can generate and return a JWT token here if needed
                return Ok(new { Message = "Registration successful" });
            }
            else
            {
                
                return BadRequest(new { Errors = result.Errors });
            }
        }

       
        return BadRequest(new { Message = "Invalid registration data" });
    }
}

注意:我正在使用身份为asp.net core MVC应用程序做,如果您需要JWT,我已经在代码片段中注释了您也可以返回JWT。

我想添加一些个人信息,例如地址、性别、 名字、姓氏等。我可以自定义此 IdentityModel 吗?

是的,您可以做到这一点,您只需要一个新类来覆盖

IdentityUser
类。您可以按照以下步骤操作:

public class ApplicationUser : IdentityUser
    {
        public string Address { get; set; }
        public string Gender { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

使用ApplicationUser的Db上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    
        public DbSet<ApplicationUser> ApplicationUsers  { get; set; }
        
    
    }

如何更改 expiresIn 属性的值?默认值为 3600.

为此,您需要修改具有属性 ExpiresSecurityTokenDescriptor 类,在这里您可以以日期时间格式设置所需的值。让我们来看看,你能做到吗:

当您对用户进行身份验证时,您的责任是重定向到正确页面中的用户或生成令牌。因此,当您生成令牌时,只需执行以下操作:

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(claims),
    Expires = DateTime.UtcNow.AddHours(2)
   
};

var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(securityToken);
© www.soinside.com 2019 - 2024. All rights reserved.