1. 程式人生 > >[轉]asp.net權限認證:HTTP基本認證(http basic)

[轉]asp.net權限認證:HTTP基本認證(http basic)

border expr == gets tps ram word tro cred

本文轉自:http://www.cnblogs.com/lanxiaoke/p/6353955.html

HTTP基本認證示意圖

HTTP基本認證,即http basic認證。

客戶端向服務端發送一個攜帶基於用戶名/密碼的認證憑證的請求。認證憑證的格式為“{UserName}:{Password}”,並采用Base64編碼,經過編碼的認證憑證被存放在請求報頭Authorization中,Authorization報頭值類似:Basic MTIzNDU2OjEyMzQ1Ng==。服務端接收到請求之後,從Authorization報頭中提取憑證並對其進行解碼,最後采用提取的用戶名和密碼實施認證。認證成功之後,該請求會得到正常的處理,並回復一個正常的響應。

技術分享

註:其實basic 的參數傳輸方式還是一種不錯的數據傳輸加密方式哦,多采用這種前後端數據交互方式的項目頗多,只是一般與https一起使用,這個後邊再講。

新建一個demo

技術分享

demo很簡單,新建一個Attribute:BasicAuthorizeAttribute用於實現basic認證

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class BasicAuthorizeAttribute : AuthorizeAttribute
{ protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext) { if (actionContext.Request.Method == HttpMethod.Options) return true; if (actionContext.Request.Headers.Authorization != null && actionContext.Request.Headers.Authorization.Parameter !=
null) { var authorizationParameter = Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter); var basicArray = Encoding.Default.GetString(authorizationParameter).Split(‘:‘); var userid = basicArray[0]; var password = basicArray[1]; if (userid == "123456" && password == "123456") { return true; } } return false; } protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) { var responseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized); responseMessage.Headers.Add("WWW-Authenticate", "Basic"); throw new HttpResponseException(responseMessage); } }
1

1、Convert.FromBase64String這句是解密經過BASE64加密的報文中的Authorization值,然後得到帶格式的用戶登錄數據:{UserName}:{Password}
得到用戶userid就可以自定義驗證用戶合法性了

2、HandleUnauthorizedRequest重寫這個方法是為了服務器返回basic認證的格式,即前臺彈出的那個登錄框,
而BASE64加密及報文傳輸這不能算是basic認證特有,我們的表單數據傳輸都可以用這種方式

用法也很簡單,在ApiController或方法上邊加屬性即可,如:

1 2 3 4 5 [BasicAuthorize] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; }

  

好了,我們來看看允許效果

技術分享

如期顯示,輸入用戶賬戶後即可看到訪問的資源

技術分享

BASE64的加密強度非常低,一般是不會直接用這種方式加密傳輸數據的

因為base64加密存儲在客戶端報文中,而且解密非常簡單,幾乎就相當於明文傳輸,沒有任何自定義key一起加密,所有一般不推薦

如果一定要使用的話,建議使用 base64 + https,下面我們在https環境運行程序。

1、IIS Express屬性,啟用SSL

技術分享

開發環境vs啟用SSL就是那麽簡單,呵呵。。

2、再次運行網站,顯示正常

技術分享

3、點擊確定

技術分享

why? 很疑惑是不是?? 不是說https是加密傳輸的嗎,但是Authorization信息貌似還是明文傳輸。。

呵呵,這個問題我也困惑了好久。

4、我們先看看http與https不同的地方

技術分享

多了一層SSL,這個SSL層不是體現在網頁端,所以我們看到http與https運行後,訪問/api/values產生的html編碼都是一樣的

不一樣的地方在於https的傳輸方式,傳輸是加密的

除此之外,內容在客戶端和服務端都是明文顯示的哦,大家要註意了。

5、對於https傳輸加密的研究,已經超出本章的範圍,據我網上了解,https在一定條件下也是可以被抓包的。

但是是加密之後的數據,沒有私匙抓包也沒有用處。所有可以安全使用

asp.net權限認證系列

  1. asp.net權限認證:Forms認證
  2. asp.net權限認證:HTTP基本認證(http basic)
  3. asp.net權限認證:Windows認證
  4. asp.net權限認證:摘要認證(digest authentication)
  5. asp.net權限認證:OWIN實現OAuth 2.0 之客戶端模式(Client Credential)
  6. asp.net權限認證:OWIN實現OAuth 2.0 之密碼模式(Resource Owner Password Credential)
  7. asp.net權限認證:OWIN實現OAuth 2.0 之授權碼模式(Authorization Code)
  8. asp.net權限認證:OWIN實現OAuth 2.0 之簡化模式(Implicit)
分類: 權限認證

[轉]asp.net權限認證:HTTP基本認證(http basic)