2021年3月1日 星期一

.net core 採用 Cookie驗證下的用戶身分抓取

enter image description here

關於 .net core的登入與身分驗證方式

前情提要…

前幾天,我們示範了如何在 .net core 環境下,使用 cookie-based authentication 來實現登入與身分驗證功能。這個做法是從 .net framework以來就有的,也是延續到 .net core 最簡單且輕量級的身分驗證(登入)方式。

整個作法的影片在底下:

https://youtu.be/ag9vQX9GAPs

當然,ASP.NET Core和 ASP.NET Framework 一樣,另外還有一整套 ASP.NET Core Identity機制,這套機制非常完整,除了基本的身分驗證,還包含權限管理、角色(Role)、Token、電子郵件驗證、忘記密碼…etc. 功能繁多。但當然也笨重很多。對於資料庫和身分管理邏輯也有一定程度的相依性。

也因此,我自己比較喜歡 cookie-based authentication 的簡單方法。

而採用了 cookie-based authentication 後的網站,可以透過 C# 後端程式碼,以很簡單的方式透過底下這樣的指令:

User.Identity.Name

就可以抓取到當前登入的用戶名稱。詳細的做法,在上面的影片中我們已經初步的介紹了。

接著,有讀者問到了OAuth的驗證整合,最常見的就是Google 登入。Google登入是什麼呢? 你會看到最近很多網站,都採用Google帳密登入,而非使用網站自己的帳密(也或許是兩者同時)。

所謂的Google 登入驗證,是一種SSO(Single-Sign On)登入機制,採用的其實是一套業界標準的OAuth機制,除了Google以外,Microsoft、Twitter、LINE都有利用這個標準做出了自己的登入功能。相關的說明您可以參考筆者之前的介紹。採用這個機制時,網站不需要知道用戶的Google帳密,只需要把身分驗證這一段,丟給Google去作,作完後把結果以Token回傳給網站。

透過Google SSO登入之後,我們可以取得用戶的Token,藉由Token取得用戶的身分(email),接著,再利用前面介紹過的cookie-based authentication,把取得的 email 視為用戶已登入的帳號,以該帳號完成用戶登入,如此一來,就在 .net core的 WebApp(Razor Page)實現了 Google SSO 搭配cookie-based authentication的身分驗證功能,這部分可以參考底下這個Lab,你會看到整個開發流程,以及實作出來的結果:
https://github.com/isdaviddong/HOL-DotNetCore/blob/master/Auth/使用 .net core 搭配 Google SSO(Single-Sing-On).md

讀者請留意,你必須先申請Google SSO所需相關資訊,像是Client_id, Client_Secret,才能夠實作上面這個Lab

WebAPI怎麼辦呢?

但接著,又有另一位讀者問到另一個問題,那如果我要搭配WebAPI,該如何作呢?

嚴格來說,WebAPI中要抓取用戶身分,其實跟Google SSO/OAuth無關,純粹就是cookie-based authentication得延伸,只是剛好我們先使用了Google SSO作為用戶的身分而已。

因此,我又作了Github上的這個範例:
https://github.com/isdaviddong/dotnetCoreWebAppGoogleSSOWithWebAPI/
這是一個razor page + Web API的範例,登入採用Google SSO,完成後以cookie-base的方式保存身分的範例。

但請看其中的WebAPI:
https://github.com/isdaviddong/dotnetCoreWebAppGoogleSSOWithWebAPI/blob/main/ValuesController.cs

你會發現,一但身分保存之後,在WebAPI中一樣直接透過

User.Identity.Name

就可以抓取到用戶身分,一個簡單的WebAPI程式碼如下(11行):

就這樣,不管你在 Razor Page, MVC, WebAPI都可以輕鬆的抓取當前呼叫的用戶身分。

使用 cookie-based authentication 這個架構很簡單漂亮,這讓後端C#中的程式碼(不管是MVC, Razor Page, WebAPI),都很容易的可以得知當前的用戶是誰。

如果你作的是一個企業內的商業應用程式,或是一個B2C或B2B的網站,那透過這樣的模式,在前端呼叫後端API時,不需要額外採用Token方式去驗證用戶身分,可以大幅降低開發時間,同時確保API被呼叫的安全性(可以輕鬆在API中檢查用戶身分)。

如果你採用前後端分離的架構,前端的開發框架(例如Vue),想要呼叫後端的WebAPI時,也可以透過這樣的方式,後端的C# Code自然而然能夠得知用戶身分,只有一個前提,前端必須在同一個domain。

那如果,前端是手機或另一個domain,要支援跨domain的身分驗證呢?

那就是另一個故事了…改天,再找機會繼續跟大家說明。

參考文件

A> Use cookie authentication without ASP.NET Core Identity

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-5.0

B> Introduction to Identity on ASP.NET Core

https://docs.microsoft.com/zh-tw/aspnet/core/security/authentication/identity?view=aspnetcore-5.0&tabs=visual-studio

相關課程:

https://www.studyhost.tw/NewCourses/Architecture

2021年1月15日 星期五

透過容器化使用LUIS在地端進行語意分析

透過容器化使用LUIS在地端進行語意分析

enter image description here

應該大家都知道,微軟從幾年前開始,推出了一系列的AI服務,稱為Cognitive Services,內容包含可以識別人臉、辨識圖片內容的電腦視覺,可以即時聽寫(語音轉文字)或輸出(文字轉語音)的Speech API,可以透過類神經網路翻譯的Translator API,還有可以讓chat bot認得用戶輸入的文字的LUIS與QnA…等。

這些服務在雲端上固然方便好用,但每次上課都會有學員問到,可不可以把模型匯出然後在on-premise環境做辨識?

一般會有這種需求不外乎兩個理由,其一是速度,另一個更重要的則是安全性,因為客戶往往不希望要辨識的圖像或文字透過網際網路被傳遞到遠端的伺服器中。

可以嗎? 是的。現在,透過容器化技術,你可以這麼做了。
如今大部分的cognitive services都開始支援容器化的應用方式。我們可以從雲端下載LUIS run-time的image,然後把在雲端上訓練好的模型下載後,透過Container技術在客戶端(用戶端)在on-premise環境做辨識。

怎麼做呢? 其實很簡單。

首先,透過docker command下載雲端上的LUIS run-time(如果在windows上使用,必須安裝好docker desktop):
enter link description here

完成後,從https://www.luis.ai/網站上把訓練好的luis模型也下載下來:
enter link description here

你應該會下載到一個.gz檔案。
接著建立兩個資料夾,分別是 C:\input 與 C:\output ,用別的路徑當然也可以,後面的docker run指令配合著修改即可。

把剛才下在好的.gz檔案放入 input 資料價,請注意如果需要時要調整檔名,檔名格式為 LUISAppID_PRODUCTION.gz :
enter link description here

上述都準備完成後,請執行剛才下載的 docker image:
enter image description here

上面docker run指令的格式為:

docker run --rm -it -p 127.0.0.1:5000:5000 --memory 4g --cpus 2 `  
--mount type=bind,src=c:\input,target=/input `  
--mount type=bind,src=c:\output,target=/output `  
mcr.microsoft.com/azure-cognitive-services/luis:latest `  
Eula=accept `  
Billing=https://XXXXXXXXX.cognitiveservices.azure.com `  
ApiKey=78XXXXXXXXXXXXXXX21

其中的billing可設為你的Luis服務的endpoint,ApiKey當然是你的LUIS服務的Key。

你會發現,透過這樣的執行後,LUIS Container被執行了起來,我們可以在Localhost:5000看到LUIS服務了:
enter image description here

而辨識的API,也可以從localhost呼叫到了:
enter image description here

很讚吧。
感謝Docker感謝Container,讓一切變得如此簡單。

ref:
https://docs.microsoft.com/zh-tw/azure/cognitive-services/luis/luis-container-howto?tabs=v3

Related Posts Plugin for WordPress, Blogger...

熱門文章