我正在try 在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"
}

我如何改变属性的值?默认值为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" });
    }
}

Note:我正在为ASP.NET核心的MVC应用程序做身份识别,如果你需要JWT,我已经在代码片段中注释了你CNA返回JWT以及.

我想添加一些个人信息,如地址、性别、 名字、姓氏等.我可以自定义此标识模型吗?

是的,您可以做到这一点,您所需要的就是一个覆盖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的数据库上下文:

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; }
        
    
    }

如何更改ExiresIn属性的值?缺省值为 3600人.

为此,您需要修改您的SecurityTokenDescriptor类,它具有属性Expires,您可以在这里以日期时间格式设置您想要的值.您可以看到以下内容:

enter image description here

让我们来看看,你能做到吗?

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

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(claims),
    Expires = DateTime.UtcNow.AddHours(2) // Set the time you need
   
};

var tokenHandler = new JwtSecurityTokenHandler();
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(securityToken);

Note:如果您仍有任何困惑,请参阅我们的官方文件tokenDescriptor modifiationcusomize IdentityModel

Csharp相关问答推荐

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

ASP.NET Core -是否可以对所有最小API端点应用过滤器?

.NET框架4.7.2项目如何引用.NET Core 2.2库?

如何在Visual Studio中为C# spread操作符设置格式规则?

处理. netstandard2.0项目中HttpClient.SslProtocol的PlatformNotSupportedException问题""

安装附加的. exe与Visual Studio

`Task`只有在C#中等待时才会运行吗?

在C#中使用类中的对象值

如何在实体框架中添加包含列表?

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

当索引和外键是不同的数据类型时,如何设置导航属性?

泛型参数在.NET 8 AOT中没有匹配的批注

WPF动态设置弹出窗口水平偏移

解决方案:延长ABP框架和ANGING OpenIddict中的令牌生命周期

将C#类导入到PowerShell

C#静态抽象属性不能被子接口覆盖

并发表更新.EF核心交易

在Unity C#中按键点击错误的参数

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>