2014-08-27 99 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

一個可能的解決方案是保留一個單獨的黑名單令牌/用戶列表。也許這最好由商業實踐來決定。確實有時候你應該立即鎖定用戶。這可以通過對所有令牌進行清除並強制所有合法用戶進行登錄來完成。對於某些情況稍有不便,對其他情況不可接受。

相關問題