Asp.net

OWIN OAuth 2 令牌是如何實際創建的?

  • July 20, 2019

我們有 OWIN OAuth 2.0 工作(感謝這篇精彩的文章),但需要更深入地了解在 HTTP 響應中將其ClaimsIdentity轉換為實際字元串的實際過程。access_token

我們ClaimsIdentity在 OAuth 授權提供程序中創建 at 這個方法:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
   // <snip>
   public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
   {
       // validation, user checking code here

       var identity = new ClaimsIdentity(context.Options.AuthenticationType);
       identity.AddClaim(new Claim("sub", context.UserName));
       identity.AddClaim(new Claim("role", "user")); 
       context.Validated(identity);
   }
}

當我們將 HTTP POST 請求設置為grant_type=password&username=user007&password=jamesbond(放鬆,這裡的密碼可以)時,我們會得到 HTTP POST 響應正文

{"access_token":"9K8VtOBseU0-XZfdGe2_urn2HESY3jLkpgvowOQFPXsHeWNOrTlTVzfPu35ZEvr4AqSj_b0laesBegtVWuR8R-aItnNXw4vXiuCg0cTNMUKP_yfi89VhD446o2X6ffL8upwZVILpomweSweIVlDmwUDzIwf1ZqubrQ8vuiQDFu-_7vpjPwJ5yVvomQ75agsJWMZk-H_bVWSObds82aM8LCRJwb2bUJchr6_L1GP8xdXqRQz24uDhHvco-XByyMSMzZm-Qo0VVBbocbgP64OJulbihVG_W9e8G69UfbX99pIYiLyE4jixiUtjOKSiMYBISW3_fg","token_type":"bearer","expires_in":1799,"as:client_id":"","userName":"user007",".issued":"Fri, 31 Oct 2014 16:02:05 GMT",".expires":"Fri, 31 Oct 2014 16:32:05 GMT"}

問題:創建實際access_token字元串的邏輯是什麼?

問題中的一些具體問題

  1. access_token該字元串的內部結構是什麼?
  2. 它是加密的還是簽名的或兩者兼而有之?使用的密鑰是什麼(假設 IIS/Azure 雲服務)?
  3. 我們如何覆蓋生成發出的實際字元串的實現,然後在後續訪問中檢查相同的令牌/字元串?

謝謝

很高興我的文章有用,請找到以下答案:

1 - 這個“神奇”字元串是一個加密簽名的字元串(糟糕的 MSDN 文件,說加密或簽名不清楚),其中包含已登錄使用者的所有聲明和票證屬性的反序列化版本。如果在 IIS 模式下,加密/簽名是通過machineKey節點(文件)中的“decryptionKey”和“validationKey”鍵值完成的。如果作為獨立的 OWIN 應用程序執行,則加密使用舊版 DPAPI 來保護它,並且實際上使用過時的 3DES 算法(文件)。它的預設實現在此處的原始碼中。

2 - 在第 1 點中回答。

3 - 查看我的新文章,我在其中展示瞭如何發布簽名的 Json Web 令牌而不是預設訪問令牌。

希望這能回答你的問題。

引用自:https://stackoverflow.com/questions/26679111