【发布时间】:2019-03-18 01:36:05
【问题描述】:
我有一个用户和一个 RefreshToken。我需要在这两个对象之间创建一对一的关系。我的 RefreshToken 对象看起来像这样
`public class RefreshToken
{
[ForeignKey("User")]
public string RefreshTokenID { get; set; }
public string UserId { get; set; }
public User User { get; set; }
public string Token { get; set; }
}`
我的用户对象看起来像这样
`public class User : IdentityUser
{
public RefreshToken RefreshToken { get; set; }
}`
以下是我如何使用 _refreshTokenRepository 为用户保留 RefreshToken:
`public async Task<bool> SaveAsync(User user, string newRefreshToken, CancellationToken ct = default(CancellationToken))
{
if(user.RefreshToken != null) return false;
RefreshToken rt = new RefreshToken(newRefreshToken, DateTime.Now.AddDays(5), user.Id);
await _dbContext.RefreshTokens.AddAsync(rt);
await _dbContext.SaveChangesAsync(ct);
return true;
}`
当用户被重定向到“/refresh”路由时,以及当我需要检查用户的刷新令牌与从客户端返回的令牌时,就会出现问题。此属性检查始终为null:
`var user = _userManager.Users.SingleOrDefault(u => u.UserName == username);
if(user == null || user.RefreshToken.Token != refreshToken) return BadRequest();`
用户实际上是正确的用户并且被找到了,但是 RefreshToken 属性为空。
我已经尝试使用 fluent API 来创建这种关系。同样的结果。刷新令牌已成功保存到表中具有正确用户 ID 的数据库,但导航属性不起作用。任何想法为什么?
【问题讨论】:
-
您的 RefreshToken 具有“用户”作为导航属性,但似乎同时使用 userId 和 refreshtokenid 作为外键。你的目标是什么?让 RefreshTokenId 唯一,还是与 UserId 相同?
-
我希望 RefreshToken 是唯一的,并且每个用户只有一个。
标签: c# entity-framework-core asp.net-core-webapi