2015-12-03 56 views
2

我們使用ASP.NET WebAPI 2 &開發了一個REST API,使用ASP.NET Identity對其進行了安全保護。客戶端需要將其令牌設置爲較長的​​到期時間,因爲它們將訪問令牌存儲在其數據庫中。縮短OWIN在ASP.NET中返回的訪問令牌WebAPI 2

在測試過程中,他們要求我們減少令牌的長度,因爲他們的數據庫只能處理多達250個字符的字符串。我們的實施非常「香草」。以下是我們目前爲不記名令牌設置的選項:

OAuthOptions = new OAuthAuthorizationServerOptions { 
    TokenEndpointPath = new PathString("/oauth/2/token"), 
    Provider = new ApplicationOAuth2Provider(PublicClientId), 
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1000000), 
    AllowInsecureHttp = true 
}; 

我們將如何將令牌縮短到250個字符限制?我注意到與設置自定義訪問令牌格式化程序等有關的一些屬性,但我不確定如何實現這些限制和/或陷阱。

任何援助將不勝感激。

+0

答案應該是NO。我們有安全標準,我們不能把這些風險放在...... –

回答

0

我會首先將標記中包含的索賠數量減少到最低限度。

並且250個字符太短而無法表示任何類型的加密數據結構,例如驗證令牌。客戶端可能會更改爲varbinary,但由於它們正在混淆架構,因此它們可能會增加大小。

運行一些測試以查看您的本地最大值,並添加10%。

1

答案是肯定的。

由於客戶端只是將相同的令牌字符串發送回服務器,您可以發送令牌的哈希值。

我所做的是使用GUID來表示令牌,它只有32個字符。 並將映射信息(GUID =>標記)存儲在服務器端。 當用戶嘗試通過GUID進行身份驗證時,您可以從存儲位置讀取REALLY令牌,然後反序列化票證。

下面是示例代碼,核心是重寫的OnCreate/的onReceiveOAuthAuthorizationServerOptions類方法。 您可能還想覆蓋OnCreateAsyncOnReceiveAsync

OAuthOptions = new OAuthAuthorizationServerOptions 
{ 
    TokenEndpointPath = new PathString("/Token"), 
    Provider = new ApplicationOAuthProvider(PublicClientId), 
    AccessTokenProvider = new AuthenticationTokenProvider 
    { 
     OnCreate = (context) => 
     { 
      var token = context.SerializeTicket(); 
      var guid = Guid.NewGuid().ToString("N"); 
      // You need to implement your own logical here, for example, store the mapping (guid => token) into database 
      RedisServer.SetValue(guid, token, TimeSpan.FromDays(Consts.AccessTokenExpireDays)); 
      context.SetToken(guid); 
     }, 
     OnReceive = (context) => 
     { 
      var token = RedisServer.GetValue(context.Token); 
      context.DeserializeTicket(token); 
     } 
    }, 
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(Consts.AccessTokenExpireDays), 
    // In production mode set AllowInsecureHttp = false 
    AllowInsecureHttp = true, 
}; 
相關問題