2021年3月20日 星期六

.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/aspnetcoreauth
https://www.studyhost.tw/NewCourses/Architecture

沒有留言:

熱門文章