我正在尝试在 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。
我期望轻松定制这个模型,但是当我在互联网上搜索解决方案时,我看到每个程序员都从头开始创建身份验证服务。除了这个解决方案,我想知道我可以自定义默认模型吗?
我如何管理这个端点?我没有创建任何控制器。什么时候 我要注册,请求模型是这样的
好吧,你可以引入你自己的 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.
为此,您需要修改具有属性 Expires 的 SecurityTokenDescriptor 类,在这里您可以以日期时间格式设置所需的值。让我们来看看,你能做到吗:
当您对用户进行身份验证时,您的责任是重定向到正确页面中的用户或生成令牌。因此,当您生成令牌时,只需执行以下操作:
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);