2014-08-27 98 views
3

我已经查看了源代码和测试,但没有看到撤销令牌的方法。我需要涵盖禁用用户访问并需要立即发生的情况。是否可以用Nancy.Authentication.Token取消令牌?

鉴于令牌存储在keyChain.bin中,可能会对该集合进行反序列化,对所有令牌进行detoken化,删除所需的on,再次序列化该集合。这听起来很精细。还有其他方法可以使用吗?

更新

潜在的我可以保持用户ID的单独列表,他们已经发出令牌,然后匹配与钥匙扣收集令牌。

更新2

与钥匙串文件播放后,事情多一点混乱。创建新用户后,我发出了一个令牌:

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

默认情况下,南茜会在二进制文件中的每个标记存储,这样如果你的服务器需要被退回,用户会话将生存。通过不同的浏览器会话,我可以连接新的用户凭据并访问该网站。当我添加另一个用户时,我希望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没有更新,那么我不能追求在单独的商店中注册令牌和用户的想法,然后清除该令牌以撤销访问。

回答

1

正如杰夫所说,代码的作者,keyChain.bin只存储了用于生成令牌的密钥。这是为了使相关信息仅存储在客户端上,并且使用客户端令牌的简单比较来避免查询后端源。 Jeff的complete explanation is here

一个可能的解决方案是保留一个单独的黑名单令牌/用户列表。也许这最好由商业实践来决定。确实有时候你应该立即锁定用户。这可以通过对所有令牌进行清除并强制所有合法用户进行登录来完成。对于某些情况稍有不便,对其他情况不可接受。

相关问题