创建和验证邀请码/令牌

6

我正在使用ASP.NET Core创建一个系统,邀请用户加入一个组,并获得免费积分...

当邀请用户加入一个组时,我会创建一个邀请并将其保存在数据库中:

令牌与其他信息一起保存在数据库中:

Invitation invitation = new Invitation {
  InvitationType = "JoinGroup",
  Completed = false,
  Expiry = DateTime.Now.AddDays(4),
  Token = some_token,
  Parameters = new List<Parameter> { 
    new Parameter { Name = "GroupId", Value = 22 },
    new Parameter { Name = "RoleId", Value = "Admin" },
    new Parameter { Name = "Email", Value = "someuser@name.com" },
  }
}

然后我发送了一封带有URL的电子邮件:

/invite?token=some_token

当用户访问 URL 时,我会获取具有给定令牌的记录。

根据该信息,我需要执行必要的操作,例如将用户添加到组中。

问题

我应该如何创建唯一的令牌?

应该在令牌中包含哪些信息?

以及我应该如何验证它?


2
  1. Guid.NewGuid() 2. None 3. 通过检查它是否在数据库中(并将其设置为过期/已使用)主要基于个人观点。
- Selvin
这是一个太宽泛的问题。有很多方法可以解决。 - DetectivePikachu
这是一个完全有效的问题。事实上,ASP.NET Core有一个特定的功能来解决这个问题。 - Jonathan Alfaro
我在答案中添加了一个链接,以帮助您入门。 - Jonathan Alfaro
@Darkonekt 是的,我的初始想法是使用UserManager.GenerateUserTokenAsync...但是如果我只是通过电子邮件邀请某人,而且可能用户尚不存在,那么方法的User参数应该是什么?其他数据放在哪里?放在令牌内部? - Miguel Moura
显示剩余2条评论
1个回答

3

ASP.NET Core Identity提供生成不同用途的令牌功能。

使用UserManager,您可以为多个目的生成令牌。

其中之一可用的方法是UserManager.GenerateUserTokenAsync(TUser, String, String)。

您可以使用UserManager.VerifyUserTokenAsync(TUser, String, String, String)方法验证令牌。

文档参考

以下链接将帮助您入门:Identity Tokens


1
是的,我知道,实际上我之前有一个关于这个问题的问题(https://stackoverflow.com/questions/58606355/create-token-to-be-sent-by-email-inviting-a-person-to-a-group)...但是如果用户不存在,而你只是通过电子邮件邀请某人,那么在User中会放置什么? - Miguel Moura
1
您可以创建用户并发送带有密码重置链接的邀请电子邮件给用户。由于您已经拥有了该电子邮件地址,因此可以创建用户,并基于新用户在电子邮件中发送必要的令牌和链接。 - Jonathan Alfaro
你也可以提示用户“完成账户设置”或“确认账户”。 - Jonathan Alfaro
1
不确定这是否是一个好主意...我的意思是,用户A通过电子邮件邀请人B,由于该账户不存在,因此代表其创建一个账户...听起来很奇怪。 - Miguel Moura
账户未经确认将不会被使用,所以这并不重要。该账户不需要个人信息...只需要电子邮件即可。一旦他们接受邀请,就会提示他们完成账户设置。如果他们没有完成,则在您的系统中只是一个非活动账户。 - Jonathan Alfaro
我所能想到的另一个选择是加密任意值并在链接中发送它。这也可以使用asp.net核心的数据保护功能完成。 - Jonathan Alfaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接