我查看了源代码和测试,但没有看到撤销令牌的方法。我需要涵盖我禁用用户访问权限的情况,并且需要立即进行。
鉴于令牌存储在keyChain.bin中,可能会对集合进行反序列化,对所有令牌进行去除,删除所需的on,再次序列化集合。这听起来很精致。我还有其他方法吗?
更新
我可以保留一个单独的用户ID列表和已发出的令牌,然后将令牌与keyChain集合匹配。
更新2
使用keyChain文件后,事情变得更加混乱。创建新用户后,我发出一个令牌:
var newServiceIdentity = siteSecurityManager.CreateServiceUser(user.UserId, user.Password)
.GetServiceIdentity();
string token = _tokenizer.Tokenize(newServiceIdentity, this.Context);
newServiceIdentity.Token = token;
siteSecurityManager.RegisterToken(newServiceIdentity);
var fileStore = new FileSystemTokenKeyStore(_rootPathProvider);
var allKeys = fileStore.Retrieve() as Dictionary<DateTime, byte[]>;
return new { Token = token };
默认情况下,Nancy会将每个令牌存储在二进制文件中,这样,如果您的服务器需要被退回,用户会话就会存活下来。通过不同的浏览器会话,我使用新用户凭据连接并获得对该站点的访问权限。当我添加另一个用户时,我希望allKeys计数会增加以反映我的管理员会话以及与其他浏览器连接的新用户。我看到一个计数,密钥与管理令牌匹配。
我的登录方法确实为每个使用正确凭据连接的用户发出令牌。那个逻辑是:
var userServiceIdentity = ServiceIdentityMapper.ValidateUser(user.UserId, user.Password);
if (userServiceIdentity == null)
{
return HttpStatusCode.Unauthorized;
}
else
{
string token = _tokenizer.Tokenize(userServiceIdentity, this.Context);
return new { Token = token };
}
我存储令牌并在每次Ajax调用时返回它。这里的含义是我确实记录了令牌,否则验证将失败。但是如果keyChain.bin没有更新,那么我就无法在单独的商店中注册令牌和用户,然后清除该令牌以撤销访问权。
答案 0 :(得分:1)
正如代码作者杰夫向我解释的那样,keyChain.bin只存储用于生成令牌的密钥。这样,相关信息仅存储在客户端上,并且使用客户端令牌的简单比较来避免查询后端源。杰夫的complete explanation is here
一种可能的解决方案是保留单独的黑名单/用户列表。也许这最好由商业惯例决定。确实有时你应该立即锁定用户。这可以通过为所有令牌发出清除来完成,并强制所有合法用户登录。某些情况下的轻微不便,而其他情况则不可接受。