【譯】Asp.Net Identity Cookies 格式化

来源:http://www.cnblogs.com/rocketRobin/archive/2017/11/10/7815516.html
-Advertisement-
Play Games

原文出處 [Trailmax Tech Max Vasilyev: ASP.Net MVC development in Aberdeen, Scotland ](http://tech.trailmax.info/2014/08/aspnet identity cookie format/) "中 ...


原文出處
Trailmax Tech
Max Vasilyev: ASP.Net MVC development in Aberdeen, Scotland

中英對照版

我的讀者聯繫到我,並向我提出了一系列關於 AspNet Identity的問題。一開始我覺得這些問題都會比較簡單,我能夠輕鬆的回答他,但結果表明,這裡面的每一個問題都值得寫一篇單獨的文章。所以我會寫一個Mini系列關於Identity框架的“Q-A(問與答)”博客。

第一個問題是關於Cookie安全Token以及它是如何被計算(computed)出來的:如果同一個用戶在 Chrome 和Firefox中登陸,那麼Identity Framework 在Cookie中創建token,token包含相同的信息(用戶Id、 Security Stamp、等等),但是為甚麼這兩個Cookie是不同的?

我思考了一下,我猜 cookie創建信息和過期信息被編碼在了cookie中,可能還有cookie的某種簽名信息也被一同保存了。我覺得我猜的很接近答案。

幸運的是,處理cookie的代碼就在開源的 Katana Project 中。

下麵就是用戶登錄是cookie的創建過程

  1. Identity framework根據你資料庫中的信息創建ClaimsPrincipal對象(它對應於 ApplicationUser類)
  2. Identity向principal中添加一些列預設claim,例如ApplicationUser.Id和SecurityStamp
  3. ClaimsPrincipal被傳遞到CookieAuthenticationHandler這個OWIN中間件中
  4. Authentication Handler對不同的東西都做了很多檢查,比如,檢查每個cookie是否應該被標記為secure或者persistent,設置過期時間等等很多事情。這一系列檢查(checks,含有操作的意思)的結果就是生成一個AuthenticationTicket,這個AuthenticationTicket擁有一個含有一系列claim和AuthenticationProperties(認證屬性)的ClaimsIdentity,AuthenticationProperties是一個包含很多數據的字典(dictionary),裡面的數據可能是 cookie issue 日期,過期日期,是否持久保存cookie,等等
  5. 認證票據和claims principal接下來被傳遞到SecureDataFormat類中,數據將在這個類中序列化、加密、Base64編碼

最後一步包含很多動作,我們再深入些。

認證票據由TicketSerializer進行序列化。這裡ClaimsIdentity被寫入記憶體流:包含一些屬性和一個claim列表。然後AuthenticationProperties(包括cookie 設置,過期日期)也被寫入了記憶體流。然後記憶體流被GZip壓縮,以備接下來的處理。

管道中的下一步就是加密。加密操作由 .Net 類庫中的DpapiDataProtector提供。你可以在MSDN上閱讀相關文檔。我不確定加密的強度。文檔中說目標參數事實上是一個密碼列表。現在我在OWIN中看到了一個地方你可以在這裡設置你自己的加密密碼,而且我看到這裡主密碼是“Microsoft.Owin.Security.IDataProtector”。所以我的猜測是安全的信息不應該被放進cookie里,比如:別把連接字元串放在claim里!(註:這裡的翻譯可能不准確,建議此段參考閱讀原文)

Next step in the pipeline is encryption. Encryption is borrowed from .Net class DpapiDataProtector. You can read documentation on MSDN. I’m not sure about the strength of the encryption. The documentation says that purpose parameters are effectively a list of passwords. And now here I’ve seen in OWIN where you can set your own encryption password and I can see that the main password is set to “Microsoft.Owin.Security.IDataProtector”. So my guess would be that no secure information should go into cookie, i.e. don’t put your connection strings into user claims!

在加密之後,位元組流使用Base64編碼以易於網路傳輸。最後準備好以等待被設置到Http響應的cookie頭上。

所有的過程如下圖所示

反正,原來的問題:“為什麼在不同瀏覽器中的cookies是不同的?”的答案是:因為簽名中包含cookie的創建信息和過期時間,這在不同瀏覽器中是不同的,所以cookie中的加密信息也是不同的,所以cookie也是不同的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用Mac電腦時想遠程式控制制Windows電腦,摸索了半天搞定了 1.下載Mac遠程式控制制安裝包:http://pan.baidu.com/s/1o7ZsDQy 提取密碼:r2ja 2.安裝好之後打開,就是點擊下麵的這個APP圖標; 3.打開後點擊左上角的加號添加要遠程的電腦信息,屏幕解析度等; 4.添加 ...
  • 設置頭部代理 1.調用相機 檢測前置攝像頭是否可用 檢測後置攝像頭是否可用 調用相機 2.調用相冊 3.代理事件 4.將圖片保存到本地 ...
  • ///壓縮圖片 + (NSData *)imageCompressToData:(UIImage *)image{ NSData *data=UIImageJPEGRepresentation(image, 1.0); if (data.length>300*1024) { if (data.len... ...
  • ///沙盒路徑 + (NSString *)pathDocument{ NSFileManager *fileManager = [[NSFileManager alloc]init]; NSString *pathDocuments = [NSSearchPathForDirectoriesInD... ...
  • 作為開發者,想不想知道自己寫了多少行代碼嗎,打開終端,進入項目文件夾,然後進入想統計的某個文件夾,也可以直接在當前項目文件夾,然後終端輸入下麵的代碼就可以了 上面統計了.m、.mm、.cpp、.h、.rss尾碼的所有文件,我是這麼認為的^_^ ...
  • 常用到的屬性字元串 直接賦給label就可以了 ...
  • 前端: js: function AjaxKouBeiShopEdit() { var options = { dataType: "json", success: function (data) { alert(data); }, error: function (XMLHttpRequest, ...
  • BlockingCollection集合是一個擁有阻塞功能的集合,它就是完成了經典生產者消費者的演算法功能。所以BlockingCollection 很適合構造流水線模式的併發方案 BlockingCollection集合是一個擁有阻塞功能的集合,它就是完成了經典生產者消費者的演算法功能。一般情況下,我 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...