ASP. NET Web Api 2 透過 JWT 進行資料驗證

最近因專案需求開始接觸Web Api,在開發過程中為了要符合Restful中的「無狀態(Stateless)」,所以在資料驗證的部分就跟以往在Server Side判斷資料狀態的做法完全相反,必須把狀態儲存在Client端才符合Stateless,因此就開始在網路上看了一些資料,最後決定使用簡單又容易上手的JWT來做資料驗證。

JWT全名為JSON Web Token,是把資料加密後透過JSON的格式傳遞,總共分為3個部分header、payload和signature,並透過標點符號「.」將其串接起來,而這3個部分都會在前端透過Base64來解密,並且返回JSON格式的資料

  • header包含了加密演算法及token類型這兩項數據

  • payload主要是存放資料包含JWT規範的標準數據及自定義的數據

  • signature主要是存放對header 及 payload加密的簽章演算法的字符串(ex: HS256,HS512 …等)

最後再將組好的字串前面加上Bearer存放至Http Request的 header中

螢幕快照 2018-04-08 下午5.22.28

在開始時做前,可以先看一下JWT的流程圖喔~

jwt-diagram

圖片來源

  1. client 傳送帳號密碼作為驗證的資料
  2. server將帳號密碼透過自定義的key及演算法加密後組成JWT的格式回傳至client
  3. client透過base64來解密成JSON格式
  4. client send request時,在header 的 Authorization中加入bearer + token
  5. server必須使用相同的key及演算法解密驗證資料,如果沒錯即回傳client要求的資料

大致了解JWT流程之後,接下來就可以來實作囉~

step 1. 首先我們從NuGet安裝JWT的加密工具jose-jwt

螢幕快照 2018-04-11 下午5.37.11

step 2. 建立一個類別JwtAuthUtil.cs,負責產生token

螢幕快照 2018-04-11 下午5.49.29

加入此段加密產生token的程式碼

step 3. 建立一個LoginController : ApiController 帳號密碼正確的話就呼叫這個方法後回傳token

step 4. 接下來我們可以先啟動專案,用PostMan來測試一下是否有成功取得token

螢幕快照 2018-04-12 上午11.07.10

由上圖可知我們經由帳號密碼登錄已經成功取得token了~

接下來我們每個呼叫api的動作都會使用取得的token來做身份驗證,所以我們需要加入驗證token是否正確的程式碼。 由於可能會有很多隻不同功能的api,所以我們驗證的程式把它寫在request一定會經過的ActionFilter中,就不用每隻api都需要去呼叫這段程式碼,只需把不需驗證的api在裡面做排除的動作即可。

step 5. 新增一個 JwtAuthFilter 繼承 ActionFilterAttribute,並且Override OnActionExecuting這個方法,在這個方法中我們除了要驗證Token是否正確,還會判斷token時效是否過期,並且排除Login不需驗證

接著要把這隻JwtAuthFilter註冊在Global.asax.cs的Application_Start,網站啟動時才會生效

step 6. 新增一個HomeController : ApiController來簡單的測試

開啟PostMan,第一次我們測試不輸入Token,看是否會出現預期的錯誤

螢幕快照 2018-04-12 上午11.48.18

結果有出現我們自己給的Lose Token的錯誤訊息,表示Filter有成功地去驗證

接著我們輸入Token,測試是否能順利通過Filter驗證

螢幕快照 2018-04-12 上午11.54.14

如圖所示,輸入正確Token後,就成功通過Filter的驗證了~

針對Web Api使用JWT,以及使用PostMan來驗證Api的簡單介紹就到這裡,如有什麼問題也歡迎大家留言討論喔

以下附上程式碼連結供大家參考https://github.com/jimmingOu/WebApi.JWT

 

使用 TeamCity 實現 Auto Deployment ~ Asp.Net設定篇

繼上一篇設定完Asp.Net的Auto Build之後,接下來這一篇就要來介紹Deployment After Build ,Auto Deployment 這邊會透過 Visual Studio 的 Publish 來完成,所以文章的一開始我們會需要先完成 Visual Studio 的 Publish

step 1.  在設定Visual Studio Publish之前,我們必須在IIS上安裝Web Deploy的相關軟件才能設定成功,所以一開始我們先來安裝Web Deploy

透過下圖的「取得新的網頁平台元件」來安裝Web Platform

螢幕快照 2018-03-20 上午11.48.21

點選安裝即可

螢幕快照 2018-03-20 上午11.50.37

安裝完成後IIS介面就會多出一個Web Platform的選項,如下圖

螢幕快照 2018-03-20 上午11.56.03

step 2. 點選Web platform來安裝Web deploy的相關軟件

在右上方搜尋Web deploy,接著安裝下圖紅匡處的3個軟件

螢幕快照 2018-03-20 下午12.01.13

安裝完成後就會發現Server那一層多了一些選項

螢幕快照 2018-03-23 下午6.08.58

Application也多了一個項目

螢幕快照 2018-03-23 下午6.09.14

step 3 點選Sever那一層的Management Service,啟動remote connection

螢幕快照 2018-03-26 下午12.19.14

螢幕快照 2018-03-23 下午6.13.17

ps. 記得先stop才能修改喔,修改後也記得start

step 4 在Application點選IIS Manager Permission,加入Server上存在的帳號(VS Publish時要用的)

螢幕快照 2018-03-23 下午6.09.14螢幕快照 2018-03-23 下午6.15.26

step 5. 將剛剛設定的帳號jim加入網站目錄下的權限,這樣才可以對這個網站存取

螢幕快照 2018-03-26 下午1.52.39螢幕快照 2018-03-26 下午1.52.54

step 5. 記得打開Webdeploy 預設的port : 8172

螢幕快照 2018-03-26 下午12.33.24

step 7 接著我們回到Visual Studio,在專案上按右鍵 >> 發行

螢幕快照 2018-03-26 下午1.58.18

step 8 選擇IIS >> 發行

螢幕快照 2018-03-26 下午2.01.17

step 9 輸入發行相關設定後,可以驗證連線,沒問題後就可以儲存

伺服器:Server的遠端ip or DNS Name

網站名稱 :IIS上建立的網站名稱,也可使用預設的Default Web Site

使用者名稱與密碼:剛才加入Permission的帳號密碼

目的地URL : 發行後欲開啟網站的網址

螢幕快照 2018-03-26 下午2.06.53

到這邊我們已經完成從Visual Stusio發行到IIS 的設定,大家也可以發行看看是否可以成功把網站Deploy 到IIS

接下來TeamCity就準備透過剛剛的設定來幫我們Auto Deploy Web Site

step 10 我們回到TeamCity並且進入Build Step的設定畫面,點選Edit

螢幕快照 2018-03-26 下午2.19.26

step 11 在最下方的Command line parameters輸入以下內容

螢幕快照 2018-03-26 下午2.18.01

PS. PublishProfile=”CustomProfile” >> CustomerProfile 是剛才我們在建立玩發行設定檔後會產生的一隻檔案CustomerProfile.pubxml,Teamcity會透過這個設定檔來幫我們Deploy,所以這隻檔案也記得要Push到Git Server上面喔~

螢幕快照 2018-03-26 下午2.25.04

最後就可以在TeamCity上測試是否可以成功Deploy囉~

PS. 最後筆者在Deploy的時候有遇到權限不足的錯誤

螢幕快照 2018-03-26 下午2.17.31

這邊有兩種解決方式

  1. 在CustomerProfile.pubxml加入密碼<Password>myPassword</Password>

螢幕快照 2018-03-26 下午2.35.04

2 .在Build Step 的 Command line parameters加入 /P:Password=myPassword

螢幕快照 2018-03-26 下午2.37.19

以上就是TeamCity 上 Asp.net to IIS Auto Build的簡單介紹,過程如有什麼錯誤也請大家多多指教~謝謝~~~