我正在使用OAuth进行身份验证,为用户生成安全访问令牌的最佳方法是什么?是否应该将访问令牌存储在数据库中,或者每次请求时都生成一个新令牌?
我正在使用不记名令牌。
答案 0 :(得分:0)
访问令牌不需要存储在持久存储中(另一方面通常会刷新令牌)。使用Microsoft.Asp.Identity
库时,在asp.net Web API中实现的常见方案是,在使用FormsAuthentication成功登录后,Cookie以与发送回客户端相同的方式生成access_token。
访问令牌是序列化的ClaimsPrincipal,使用Asp.Net机器密钥加密,然后使用Base64-ed加密。
或多或少,每次客户端向API发出请求时都会出现“Authorize”标题(类似于
Authorize: Bearer asdfdsgwe.......YOUR_ACCESS_TOKEN........2334sdfs===
)服务器只需从base64-ed字符串中获取Byte[]
,然后使用机器密钥解密,最后反序列化为IPrincipal。此过程在WebAPI的生命周期的早期进行,并填充System.Threading.Thread.CurrentPrincipal
。
即表示access_token本身包含识别当前用户的所有必要信息,而无需返回数据库。
<强>更新强>
如果您对使用Microsoft.Asp.Identity
为您创建access_tokens不感兴趣。然后我建议使用System.IdentityModel.Tokens.Jwt Nuget Package来推广您自己的实现。请记住,这不是一件容易的事。还可以通过thinktecture查看优秀的开源参考实现:Thinktecture Identity Server v3
希望这有帮助。