ASP.NET Web API 可很是方便地建立基於 HTTP 的 Services,這些服務能夠很是方便地被幾乎任何形式的平臺和客戶端(如瀏覽器、Windows客戶端、Android設備、IOS等)所訪問,它可根據請求類型自動提供 JSON、XML 等類型的響應內容。在移動互聯網逐漸成爲主流的背景下,經過 Web API 對外發布基於標準、通用 HTTP 協議的服務來交換數據無疑具備很是大的優點和吸引力。本文將主要圍繞 ASP.NET Web API 的安全性進行討論。 html
1、Forms Authenticationweb
Forms 認證基於憑據(Ticket)機制,憑據在登陸時建立,一般會寫入到 cookie 中。Forms 認證可應用在任何類型的ASP.NET 應用程序中,例如:WebForms,MVC,甚至 Web API等。默認的配置是 <authentication mode="None" />,所以爲了使用Forms Authentication,一般須要在配置文件中進行配置。數據庫
儘管 Forms 認證是 Web 應用程序的首選認證方式,但從 Web API 的安全性來講,其實它並非一個理想的解決方案,對於非瀏覽器的客戶端來講,作個比喻,就像是穿西裝戴斗笠般不搭調。api
最大的問題是在ASP.NET Web API中使用 Forms 認證方式的時候,並不會返回一個 302 代碼(注:302 表示重定向,Web 應用程序中會被自動導航至設定的登陸頁面地址),在 Web API 中使用 Forms 認證方式可參考以下代碼:瀏覽器
1)在 WebApiConfig 文件中修改默認的代碼以下:緩存
2)修改 MVC 的 FilterConfig 默認代碼以下:安全
經過上述設置,對非受權的資源進行訪問時將返回一個 401 代碼(注:401 表示未經受權的請求),這和在 MVC 中非受權的請求返回到登陸頁面的含義是同樣的。服務器
有童鞋可能會問,爲何不能重定向到登陸頁面呢?其實真正的問題是 Forms 認證自己,它的原理決定了它是面向 Web 應用程序的,它有 Cookie 和重定向等的支持,而 ASP.NET Web API 倒是無狀態的 RESTful 服務,這天然是不適合的。cookie
說到這裏,休息一下,溫習下 HTTP 響應的狀態代碼。mvc
HTTP 響應的狀態代碼爲三位數字的編號,其中第 1 位定義了狀態代碼的類別:1 開頭的表明信息類、2 開頭的表明操做成功類、3 開頭的表明重定向類、4 開頭的表明客戶端一側的請求錯誤類、5 開頭的表明服務器端一側的錯誤類。
常見的狀態代碼以下:
2、身份(Identify)管理
一、認證(Authentication)和受權(Authorization)
1)認證的方式
身份認證的方式主要有以下三個方面:
典型的身份認證方式能夠爲上述的其中一種,其中第一種使用最爲廣泛,若是一個應用程序須要考慮更高的安全性,須要至少使用上述列表中的兩種身份認證方式。例如銀行卡,自己就屬於第二種認證,但在ATM上取錢時每每還須要密碼,這又使用了第一種認證方式。
2)基本角色的安全
在企業級的應用中,基於角色的安全是最多見的安全模型。在.NET Framework中提供了 Identify 對象,一個 Identify 對象表明了某個用戶,最重要就是這兩個接口:IIdentity 和 IPrincipal,這兩個接口提供了基於角色的訪問控制,其中 IIdentify 表明用戶的身份標識,IPrincipal 表明用戶關聯的身份和角色。IPrincipal 有一個 Identity 屬性和 IsInRole(string) 的方法,該方法判斷當前用戶是否屬於某個角色。
在 .NET 中,每一個線程都有一個類型爲 IPrincipal 的 CurrentPrincipal 屬性。一般,在身份認證經過後須要建立一個 Principal 對象並賦予主線程的 CurrentPrincipal 屬性,任何新建立的線程會自動建立一樣的 Principal 對象。其實在.NET Framework中已經實現了兩種類型的 Principal。
固然,你也能夠本身實現符合自身要求的 Identity 和 Principal。例如在CSLA.NET中就實現了一個自定義的 Identity 和 Principal,能夠設置 Serialized 特性,該 Principal 對象能夠經過服務從客戶端傳到服務器端進行身份的認證和受權處理,以知足其 N-Tier 部署下進行身份認證和受權的須要,經過繼承,甚至還能夠新增必要的屬性,很是方便。
3)基本聲明(Claims)的安全
典型的基於聲明(Claims)的 Identity 以下:
和前面提到的安全模型相比,在基於聲明的安全模型中,聲明的值必須來自於應用程序所信任的某個實體或機構(一般用戶是/不是什麼經過第三方驗證,能夠/不能夠作什麼由應用程序自身肯定)。
基於聲明(Claims)的安全模型每每更加貼近現實生活,能夠簡化某單個應用程序的身份驗證邏輯,由於這些應用程序不用再重複提供諸如建立帳戶、密碼、密碼重置等機制(注:這些邏輯統一由第三方應用程序完成)。
同時聲明(Claims)的安全模型也沒必要要求某個用戶屢次登陸到多個應用程序,大大簡化了用戶的身份驗證過程。
所以,聲明(Claims)的安全很是適合於諸如OAuth等第三方受權的方式和雲計算環境。
基於聲明(Claims)的安全的實例代碼以下:
很明顯,用戶是/不是什麼一般由第三方肯定,所以不少第三方提供了所謂的安全令牌(Security Token)服務。目前有三種標準的令牌(Token)格式,它們是:SAML(安全斷言標記語言)、SWT(簡單 Web 令牌)、JWT(JSON Web 令牌)。三種令牌格式對好比下:
|
SAML |
SWT |
JWT |
表現形式 |
XML |
HTML Form encoding |
JSON |
處理方式 |
SOAP |
REST |
REST |
直接支持WIF |
是 |
否 |
否 |
協議 |
WS-Trust and WS-Federation
|
OAuth 2.0 |
OAuth 2.0 |
一般的載體 |
HTTP body or URL |
HTTP Auth header (Bearer) |
HTTP Auth header (Bearer) |
支持簽名 |
是,非對稱密鑰-X509證書 |
是, HMAC SHA-256 (使用對稱密鑰) |
是,支持對稱密鑰和非對稱密鑰 |
二、Basic Authentication
在Web Api中不能不提到 Basic Authentication。Basic Authentication 是 HTTP 規範的一部分,它很是的基礎和簡單。主要工做原理以下:
由於 Base Authentication 的安全性較差,但對於無 Cookie 的 Web Api 來講,應用上很是的簡單和方便。
Base Authentication 最大的缺點是憑據會被瀏覽器緩存——直到你關閉瀏覽器爲止。若是你已經對某個URI得到了受權,瀏覽器就會在受權頭髮送相應的憑據,這使其更容易受到跨站點請求僞造(CSRF)攻擊
Base Authentication 一般須要使用HTTPS方式進行加密處理。
3、YbRapidSolution for MVC 中的 Authentication
在 YbRapidSolution for MVC 的安全解決方案中,採用了 Base Authentication 和 Form Authentication 相互補充的處理方式,使用 Attribute 方式進行請求的 Authentication 處理。Base Authentication 主要面向非Web應用的處理請求,Form Authentication 則對 MVC 的 Controller 的請求進行處理,核心代碼以下:
從上述代碼中能夠看出,在 YbRapidSolution for MVC 首先進行 Base Authentication,若是不經過,繼續進行 Form Authentication;若是 Base Authentication 經過,則建立 Form 下的 Principal 而後按 Form Authentication 的方式進行統一處理,這能夠確保任何類型的客戶端都能進行相應的 Authentication 處理,充分發揮出 Web Api 的特性,在爲各類類型的客戶端和設備提供 API 支持的同時也提供相應的安全保障。
附1:YbRapidSoluton for MVC 在線 Demo 地址:http://mvcdemo.yellbuy.com/。
附2:最新發布的 YbRapidSolution for WinForm Demo下載:運行環境-.NET 4.0。服務層部署在 Internet
上,,可直接運行;如需在本地部署,除了安裝數據庫外,就是修改配置文件,這裏再也不詳述。
附3:最新發布的 YbSoftwareFactory V2 下載,運行環境-.NET 4.0。