ASP.NET Web API 實現客戶端Basic(基本)認證 之簡單實現

優點是邏輯簡單明了、設置簡單。

缺點顯而易見,即使是BASE64后也是可見的明文,很容易被破解、非法利用,使用HTTPS是一個解決方案。

還有就是HTTP是無狀態的,同一客戶端每次都需要驗證。

?

實現:

客戶端在用戶輸入用戶名及密碼后,將用戶名及密碼以BASE64加密,加密后的密文將附加于請求信息中,如當用戶名為Parry,密碼為123456時,客戶端將用戶名和密碼用":"合并,并將合并后的字符串用BASE64加密,并于每次請求數據時,將密文附加于請求頭(Request Header)中。

HTTP服務器在每次收到請求包后,根據協議取得客戶端附加的用戶信息(BASE64加密的用戶名和密碼),解開請求包,對用戶名及密碼進行驗證,如果用戶名及密碼正確,則根據客戶端請求,返回客戶端所需要的數據;否則,返回錯誤代碼或重新要求客戶端提供用戶名及密碼。?

自定義屬性HTTPBasicAuthorize?,繼承AuthorizeAttribute,并實現兩個方法:OnAuthorization和HandleUnauthorizedRequest。

   public class HTTPBasicAuthorizeAttribute : System.Web.Http.AuthorizeAttribute{public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext){if (actionContext.Request.Headers.Authorization != null){//對客戶端進行BASE64后的字符串再解碼string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));//用戶驗證邏輯if (string.Equals(userInfo, string.Format("{0}:{1}", "Parry", "123456"))){IsAuthorized(actionContext);}else{HandleUnauthorizedRequest(actionContext);}}else{HandleUnauthorizedRequest(actionContext);}}
//或不重寫OnAuthorization,對IsAuthorized方法重寫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) { // System.Web.Security.FormsAuthentication.var userdata= System.Text.Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));if (userdata.Equals(String.Format("{0}:{1}", "tzy", "123"))) {return true;//base.IsAuthorized(actionContext);
               }}return false;// return base.IsAuthorized(actionContext);
        }protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext){var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);challengeMessage.Headers.Add("WWW-Authenticate", "Basic");throw new System.Web.Http.HttpResponseException(challengeMessage);}}

這些代碼值得注意的地方及說明

1.??if?(actionContext.Request.Method ==?HttpMethod.Options)?? 這個判斷是在進行跨域訪問時瀏覽器會發起一個Options請求去試探這個請求,但是他不會帶著data參數和一些header參數,所以認證肯定沒法通過導致無法繼續進行,所以給他直接認證通過。(對非跨域的則沒有影響)

2.對Authorization.Parameter 的解密,這里的解析跟登陸成功之后返回的Token 加密方式相同就行 這里采用的是Basic認證方式(簡單的64位字符串)

3.HandleUnauthorizedRequest方法 這里因為是繼承重寫的AuthorizeAttribute,在IsAuthorized 返回False的時候會執行這個方法

這里是返回一個401的錯誤信息

4.challengeMessage.Headers.Add("WWW-Authenticate","Basic"); ??這句代碼指示瀏覽器 認證方式為Basic 然后瀏覽器自動彈出一個登陸窗口并以basic 的方式 加密后每次通過header 傳輸到服務器進行認證然后得到授權

在需要驗證的Controller的類加上[HTTPBasicAuthorize]屬性,即可對當前控制器下的所有方法實現基本身份認證

?然后我習慣更改一下api的路由? 就改了一下routeTemplate 加入/{action}

public static void Register(HttpConfiguration config){// Web API configuration and services// Web API routes
            config.MapHttpAttributeRoutes();// config.Filters.Add(new AuthorizeAttribute());
            config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });}

如果以webapi里面有xml?方式返回,更改formatter 如下

protected void Application_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();}

?

https://www.cnblogs.com/leo_wl/p/3553385.html
Basic Authentication
具體做法:創建一個filter繼承自AuthorizationFilterAttribute,重寫OnAuthorization來實現我們的需求。
原理是:客戶端在發送Http請求的時候在Header部分提供一個基于Base64編碼的用戶名和密碼,形式為“username:password”,消息接收者(服務器)進行驗證,通過后繼續處理請求。
1.從請求Header中獲取校驗數據
2.判斷驗證信息類型為“basic”并包含base64編碼
3.將base64編碼轉化為string,并提取用戶名和密碼
4.校驗提供的驗證信息是否與訪問的資源信息相同(學生的詳細信息只能由他自己訪問)
5.去數據庫校驗用戶名及密碼
6.如果校驗通過,則設置Thread的CurrentPrincipal,使本次接下來的請求都是通過校驗的。
7.校驗沒通過,返回401(Unauthorized)并添加一個WWW-Authenticate響應頭

轉載于:https://www.cnblogs.com/shy1766IT/p/5525695.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287635.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WPF|分享一個登錄界面設計

分享一個登錄界面,先看效果圖:準備文中使用到了一些圖標:我們可以從 iconfont[1]免費下載:代碼簡單說明請隨手創建一個WPF項目(.NET Framework、.NET 5\6\7皆可),使用tree /f命令看看最終的文件…

《零基礎看得懂的C++入門教程 》——(6)自己動手寫個函數

一、學習目標 了解C語言的自定義函數的使用方法了解C語言自定義函數的傳參了解C語言自定義函數的返回值 目錄 預備第一篇,使用軟件介紹在這一篇,C與C使用的軟件是一樣的,查看這篇即可:《軟件介紹》 想了解編譯原理和學習方法點…

k8s mysql數據同步_K8s——MySQL實現數據持久化

1、搭建nfs存儲[rootdocker-k8s01 ~]# yum -y install nfs-utils[rootdocker-k8s01 ~]# mkdir /nfsdata/mysql -p[rootdocker-k8s01 ~]# cat /etc/exports/nfsdata *(rw,sync,no_root_squash)[rootdocker-k8s01 ~]# systemctl restart nfs-server[rootdocker-k8s01 ~]# systemc…

【計算機圖形學】實驗:C#語言采用GDI+定義筆刷并填充圖形完整實驗操作流程

一、實驗目的: 熟練掌握在.net環境下對筆刷的定義,并可用定義好的筆刷填充多邊形。 二、實驗準備: 學習在.net環境下GDI+所提供的5種筆刷類型,掌握定義筆刷的方法和填充圖形的函數,如FillRectange ( )、FillEllipse ( )等。 三、實驗內容: 在.net環境中設計一個窗體…

Android之提示Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed

1 問題 02-28 22:44:33.031 7379 7379 E AndroidRuntime: java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed 02-28 22:44:33.031 7379 7379 E AndroidRuntime: at android.graphics.Canvas.checkValidClipOp(C…

使用Java API的5個技巧

本文介紹了一些關于Java API安全和性能方面的簡單易用的技巧,其中包括保證API Key安全和開發Web Service方面中在框架方面選擇的一些建議。 程序員都喜歡使用API!例如為app應用構建API或作為微服務架構體系的一部分。當然,使用API的前提是能讓…

管道模式 pipe

先放一個圖,預則立嘛 PipelinePattern.rar 這里是 不完整的碼轉載于:https://www.cnblogs.com/ganmk--jy/p/5525897.html

《零基礎看得懂的C++入門教程 》——(7)小數組玩起來

一、學習目標 了解數組的使用方法了解一維數組的使用方法了解一維數組與循環的使用方法 目錄 預備第一篇,使用軟件介紹在這一篇,C與C使用的軟件是一樣的,查看這篇即可:《軟件介紹》 想了解編譯原理和學習方法點這篇&#xff0c…

SSO 方案演進

1背景介紹 隨著業務與技術的發展,現今比以往任何時候都更需要單點登錄 SSO 身份驗證。現在幾乎每個網站都需要某種形式的身份驗證才能訪問其功能和內容。隨著網站和服務數量的增加,集中登錄系統已成為一種必要。在本文中,我們將討論下 …

【計算機圖形學】實驗:VB.net環境下的圖形裁剪完整實驗操作流程

一、實驗目的: 熟練掌握在.net環境下對圖形的裁剪。 二、實驗準備: 學習圖形裁剪的基本算法,以及在.net環境下裁剪圖形的基本方法。 三、實驗內容: 在.net環境中利用裁剪圖形的基本方法對任意圖形進行裁剪。

UI之常用通過顏色值和透明度怎么得到最后的顏色值

1 、問題 UI給了顏色#000000,透明度是75%,我需要最終的顏色值。 2 、透明度色值表 00%FF(不透明) 5%F2 10%E5 15%D8 20%CC 25%BF 30%B2 35%A5 40%99 45%8c 50%7F 55%72 60%66 65%59 70%4c 75%3F 80%33 85%21 90%19 95%0c 100%00…

《零基礎看得懂的C++入門教程 》——(8)搞定二維數組與循環嵌套

一、學習目標 了解二維數組的使用方法了解循環嵌套的使用方法 目錄 預備第一篇,使用軟件介紹在這一篇,C與C使用的軟件是一樣的,查看這篇即可:《軟件介紹》 想了解編譯原理和學習方法點這篇,學習方法和一些原理C與C都…

mybatis模糊查詢不同寫法

工作中用到,寫三種用法吧,第四種為大小寫匹配查詢 1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT(%, #{text}), %); 2. 使用 ${...} 代替 #{...} SELECT * FROM tableName WHERE name LIKE %${text}%; 3. 程序中拼接 Java …

常見的Ubuntu命令30條(一)

Ubuntu命令是指在Ubuntu操作系統中用于執行各種任務和操作的命令行指令。這些命令可以用于管理系統、配置網絡、安裝軟件、瀏覽文件等。Ubuntu命令通常在終端(Terminal)應用程序中輸入并執行。 在Ubuntu中,有許多常用的命令和指令。以下是一…

【計算機圖形學】實驗:C#.net環境下的圖形變換完整實驗操作流程

一、實驗目的: 熟練掌握在.net環境下對圖形的變換方法。 二、實驗準備: 學習圖形變換的基本算法,如平移、旋轉、縮放等,以及在.net環境下變換圖形的基本方法。 三、實驗內容: 在.net環境中利用變換圖形的基本方法對圖形進行變換,包括平移、旋轉、縮放、對稱、復合變…

Android之給ImageView添加點擊效果

1 問題 給ImageView添加點擊效果 2 解決辦法 1&#xff09;、新建selector.xml文件 <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item android:drawable&…

python基礎知識縱覽(下)

python函數 1.函數作用 最大化代碼重用和最小化代碼冗余流程的分解2.函數基本概念 def創建對象并賦值給某一變量## 創建一個函數對象并賦值給fn_namedef fn_name(args1,args2,...,argsN): <statements>復制代碼def是可執行的代碼## 通過if語句判斷來做定義函數,def是實…

《零基礎看得懂的C++入門教程 》——(9)結構體原來如此

一、學習目標 了解C語言的結構體的使用方法了解C語言結構體的結構的賦值了解多種C語言結構體變量的賦值方法和取值方法 目錄 預備第一篇&#xff0c;使用軟件介紹在這一篇&#xff0c;C與C使用的軟件是一樣的&#xff0c;查看這篇即可&#xff1a;《軟件介紹》 想了解編譯原…

微信小程序python token驗證_微信小程序python 用戶認證

按流程圖來先通過wx.login()獲取code,再通過我們后臺配置的接口獲取openid和session_key// 登錄wx.login({success: res > {console.log(res)// 發送 res.code 到后臺換取 openId, sessionKey, unionIdwx.request({url: api.GET_OPENID, //data: {js_code: res.code},succes…

C#實用技巧之:將圖標打包進DLL并讀取

概述個人的項目界面有時候需要用到很多圖標&#xff0c;這些圖片可以建立一個文件夾單獨存放&#xff0c;但有時涉及到多臺設備部署的話&#xff0c;每臺設備都需要隨項目一起拷貝過去&#xff0c;如果忘記了界面顯示就會出問題&#xff0c;有沒有更好的辦法解決&#xff1f;有…