最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解ASP.NET中Identity的身份驗證代碼

 更新時間:2017年12月01日 17:27:22   投稿:laozhang  
這篇文章主要介紹了ASP.NET Identity 的“多重”身份驗證代碼,以及實現(xiàn)的原理講解,需要的朋友參考一下。

本篇內(nèi)容主要講述了實現(xiàn)基于微軟賬戶的第三方身份驗證、實現(xiàn)雙因子身份驗證、 驗證碼機制這3個內(nèi)容。

實現(xiàn)基于微軟賬戶的第三方身份驗證

在微軟提供的ASP.NET MVC模板代碼中,默認添加了微軟、Google、twitter以及Facebook的賬戶登錄代碼(雖然被注釋了),另外針對國內(nèi)的一些社交賬戶提供了相應的組件,所有組件都可以通過Nuget包管理器安裝:

從上圖中看到有優(yōu)酷、微信、QQ、微博等組件,其中一些是微軟提供的,一些是其它開發(fā)者提供的。而本文將使用微軟賬戶為例來介紹如何實現(xiàn)一個第三方登錄。

注:本章主要代碼參考ASP.NET MVC模板代碼,所以在文章中只列出關鍵代碼,其余代碼與模板中的完全一致。

組件安裝及Key申請

在開發(fā)之前首先需要通過Nuget安裝Microsoft.Owin.Security.MicrosoftAccount:

  

另外就是需要去微軟的開發(fā)者中心使用微軟賬戶創(chuàng)建一個自己的應用信息https://apps.dev.microsoft.com/,并保存應用的ID以及密鑰用于對身份驗證中間件進行配置:

  

創(chuàng)建過程如下:

1. 點擊添加應用按鈕,進入應用程序注冊頁面,填寫應用名稱并點擊Create按鈕(注:由于我已經(jīng)有一個名稱為My Blog的App,所以下面的Test App的創(chuàng)建流程僅僅是用于演示,后續(xù)的身份驗證實際上是使用之前創(chuàng)建的My Blog):

  

2. 在后續(xù)頁面中點擊生成新密碼來生成密鑰(注:該密碼只顯示一次,需要在彈出框中復制并保存下來):

  

3. 添加平臺:點擊添加平臺按鈕,添加一個Web平臺,并在平臺的重定向Url中填入本地調(diào)試的地址信息(注:一定需要啟動HTTPS并且地址后需要添加signin-microsoft,VS可以在項目的屬性中開啟SSL,并設置SSL的URL):

  

 4. 保存更改。

添加中間件

在上一篇文章中介紹了,第三方賬戶身份驗證除了特定賬戶身份驗證中間件外,還需要添加一個消極模式的外部Cookie身份驗證中間件,所以首先需要在項目的Startup文件中添加一下代碼:

  

然后再在該中間件后加入微軟身份驗證中間件(注:中間件順序會影響處理流程,微軟身份驗證中間件必須在外部Cookie中間件后),并設置上面創(chuàng)建的應用ID及密鑰:

  

添加Controller及頁面的功能支持

現(xiàn)在可以說應用中已經(jīng)支持微軟的賬戶身份驗證了,但是在應用中還未提供微軟身份驗證的入口,以及登陸后用戶信息的補全等功能。

1. 在頁面上添加驗證入口,在Login頁面上加入以下代碼,通過AuthenticationManager來獲取所有的第三方身份驗證方式,并生成對應鏈接:

  

  

2. 在AccountController中添加ExternalLogin Action方法(注:該方法主要目的是調(diào)用AuthenticationManager的Challenge方法來觸發(fā)微軟身份驗證中間件的ResponseChallenge方法來完成頁面的跳轉(zhuǎn)):

   

其中ChallengeResult是一個自定義的ASP.NET MVC Reuslt類型:

  

3. 加入第三方驗證后的回調(diào)方法ExternalLoginCallback,該回調(diào)方法是獲取第三方身份驗證后的用戶信息,然后在本地數(shù)據(jù)庫中查找該用戶,如果存在那么登錄成功,否則需要對該用戶信息進行補全。

  

4. 添加第三方賬戶信息補全頁面及Action方法,其中action方法接收到補全的用戶信息后完成用戶注冊功能,但要注意的是第三方賬戶沒有密碼,僅僅是在AspNetUserLogins表中添加了第三方驗證的信息:

   

運行結(jié)果:

1.訪問登錄頁面出現(xiàn)Microsoft的按鈕(注:必須使用HTTPS地址才能正常的使用微軟身份驗證):

2. 點擊微軟身份驗證按鈕后,跳轉(zhuǎn)到微軟賬戶登錄頁面:

  

  

3. 完成登錄后,由于是第一次登錄,所以會跳轉(zhuǎn)到信息補全頁面:

  

輸入郵箱后將登錄成功:

  

數(shù)據(jù)庫中的信息:

  

上圖中可以看到無密碼,然后在Login表中有一條數(shù)據(jù):

實現(xiàn)雙因子身份驗證

Identity的雙因子身份驗證實際上是Identity的一個內(nèi)置功能,為什么說是內(nèi)置呢?因為只需要實現(xiàn)信息的發(fā)送(如郵件、短信等),然后再對Identity中的SignInManager進行簡單的配置然后添加一些用于發(fā)送、填寫驗證碼的頁面就可以完成。所以首先需要完成的就是實現(xiàn)信息發(fā)送功能。

注:這里信息發(fā)送功能使用將信息寫到硬盤的方式模擬。

1. 實現(xiàn)信息的發(fā)送:
在ASP.NET MVC默認的模板中就為我們創(chuàng)建了如下代碼:

默認的郵件及短信發(fā)送器,只不過它沒有實現(xiàn),僅僅是返回了一個空值,現(xiàn)在使用寫硬盤的方式將信息寫到硬盤上:

   

2. 完成UserManager的雙因子驗證配置:

  

三個關鍵點:1. TokenProvider,它用來生成驗證碼。2. 信息格式。3. 信息發(fā)送服務。

3. 在身份驗證管道中加入雙因子驗證中間件:

  

兩個中間件前者用于處理二次驗證,后者用于記住登錄狀態(tài),下次訪問系統(tǒng)時自動登錄。

4. 添加驗證碼發(fā)送方式選擇以及驗證碼填寫頁面及相應的Action方法(代碼略)。

5. 在數(shù)據(jù)庫中將演示用的用戶信息改為啟用二次驗證(注:模板代碼中有用于管理個人信息的功能,此處省略了實現(xiàn),直接通過修改數(shù)據(jù)數(shù)據(jù)的方式開啟用戶的雙因子驗證、添加電話號碼等):

6. 運行結(jié)果:

登錄后需要選擇驗證碼發(fā)送方式:

選擇后點擊提交按鈕,頁面調(diào)整到驗證頁面的同時,指定的文件中生成了需要的驗證碼:

  

  

填寫驗證碼后點擊提交按鈕,則登錄成功:

  

注:雙因子驗證也可以應用到第三方賬戶的登錄方式上,雙因子驗證只與用戶有關與身份驗證方式無關。

驗證碼機制

對于雙因子驗證來說,它實際上就是在普通驗證或第三方賬戶驗證的基礎上增加了驗證碼的發(fā)送和驗證兩個環(huán)節(jié),那么對于驗證碼這個主體Identity是如何來維護的呢?

在上面的介紹中,有一個環(huán)節(jié)就是需要通過對UserManager進行配置以支持雙因子驗證的消息發(fā)送、消息生成等等:

  

根據(jù)這個代碼看來XXXTokenProvider是專門用來維護驗證碼的,而XXXService是用來發(fā)送的,所以這里將對TokenProvider進行說明,了解驗證碼是如何維護的:

上圖是TokenProvider相關的一個簡單類圖,從類圖中可以看出TokenProvider實際上是實現(xiàn)了一個名為IUserTokenProvider的接口,該接口中有4個方法,它們的作用分別是:

  ● GenerateAsync:根據(jù)UserManager以及User信息來生成一個令牌(Token)。

  ● IsValidProviderForUserAsync:判斷這個Token提供器對這個用戶是否是有效的(如果使用短信驗證,但是該用戶沒有設置手機號,那么就是無效的)。

  ● NotifyAsync:當Token生成后調(diào)用該方法通知用戶,如短信或郵件通知。

  ● ValidateAsync:用于驗證Token是否有效。

而TotpSecutityStampBasedTokenProvider是一個實現(xiàn)了IUserTokenProvider接口的,通過用戶安全戳生成驗證碼的生成器:

從代碼中可以看到該算法是基于rfc6238(TOTP: Time-Based One-Time Password Algorithm,基于時間的一次性密碼算法) https://tools.ietf.org/html/rfc6238,然后通過用戶的安全戳以及GetUserModifierAsync方法生成特定的信息熵來完成密碼加密,關于信息熵可參考:https://www.zhihu.com/question/22178202,上面將生成后的令牌執(zhí)行ToString("D6")是將其轉(zhuǎn)換為一個6位數(shù)字的字符串。

而Token的驗證方式和生成差不多都是通過用戶安全戳和信息熵來驗證提交的驗證碼(它實際上是一種hash算法):

以上已經(jīng)解釋了最初驗證碼的生成和驗證的問題,所以對于EmailTokenProvider和PhoneNumberTokenProvider只是對熵的生成、對Provider的有效性(是否存在Email或電話號碼)、通知方式進行了修改,下面是PhoneNumberTokenProvider相關代碼:

小結(jié)  

本章主要是使用代碼的形式實現(xiàn)了ASP.NET中的第三方驗證和雙因子驗證,文中的代碼都來自ASP.NET MVC的模板,所以文中僅僅是對關鍵的代碼進行了介紹,一些細節(jié)的內(nèi)容可參考完整代碼。其中第三方驗證使用的是微軟賬戶,如果有環(huán)境支持可以嘗試國內(nèi)的微信、QQ等身份驗證。

另外在文章最后對驗證碼的生成和校驗代碼進行了分析,知道了它是基于Hash算法的信息加密、驗證的機制來實現(xiàn)的。
ASP.NET MVC基于Identity提供了非常完善、強大的用戶管理和身份驗證功能,除了以上介紹的以外還有賬戶鎖定、注冊郵箱或短信驗證功能,基本上已經(jīng)涵蓋了現(xiàn)在開發(fā)常用的功能,但這些功能被一個模板實現(xiàn)了,所以ASP.NET強大嗎?

相關文章

  • 詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內(nèi)存應用

    詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內(nèi)存應用

    這篇文章主要介紹了詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內(nèi)存應用,需要的朋友可以參考下
    2017-06-06
  • C#實現(xiàn)PDF合并的項目實踐

    C#實現(xiàn)PDF合并的項目實踐

    有時我們可能會遇到需要的資料或教程被分成了幾部分存放在多個PDF文件中,本文主要介紹了C#實現(xiàn)PDF合并的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • WPF利用TabControl控件實現(xiàn)拖拽排序功能

    WPF利用TabControl控件實現(xiàn)拖拽排序功能

    在UI交互中,拖拽操作是一種非常簡單友好的交互,這篇文章主要為大家介紹了WPF如何利用TabControl控件實現(xiàn)拖拽排序功能,需要的小伙伴可以參考一下
    2023-10-10
  • C#列出所有物理網(wǎng)絡適配器的方法

    C#列出所有物理網(wǎng)絡適配器的方法

    這篇文章主要介紹了C#列出所有物理網(wǎng)絡適配器的方法,實例分析了C#操作網(wǎng)絡設備的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • unity 鼠標懸停事件操作

    unity 鼠標懸停事件操作

    這篇文章主要介紹了unity 鼠標懸停事件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#實現(xiàn)基于XML配置MenuStrip菜單的方法

    C#實現(xiàn)基于XML配置MenuStrip菜單的方法

    這篇文章主要介紹了C#實現(xiàn)基于XML配置MenuStrip菜單的方法,涉及C#使用XML配置MenuStrip菜單的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    C# 延遲Task.Delay()和Thread.Sleep()的具體使用

    Thread.Sleep()是同步延遲,Task.Delay()是異步延遲,本文主要介紹了C# 延遲Task.Delay()和Thread.Sleep()的具體使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • 關于Unity C# Mathf.Abs()取絕對值性能測試詳解

    關于Unity C# Mathf.Abs()取絕對值性能測試詳解

    這篇文章主要給大家介紹了關于Unity C# Mathf.Abs()取絕對值性能測試的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Unity C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • C#實現(xiàn)帶引導窗體的窗體設計操作流程

    C#實現(xiàn)帶引導窗體的窗體設計操作流程

    很多時候,我們的窗體設計需要一個引導窗體,當打開一個項目的窗體時,默認的是先打開一個歡迎或介紹項目信息的引導窗體,幾秒鐘后再打開項目的主窗體,本文給大家介紹了C#實現(xiàn)帶引導窗體的窗體設計操作流程,感興趣的朋友可以參考下
    2024-04-04
  • C# 腳本引擎CS-Script的使用

    C# 腳本引擎CS-Script的使用

    這篇文章主要介紹了C#腳本引擎CS-Script的使用,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-12-12

最新評論

孝义市| 普兰店市| 赤水市| 土默特右旗| 广德县| 汉川市| 仁化县| 桦南县| 连南| 阳春市| 越西县| 沙坪坝区| 灵璧县| 易门县| 成都市| 星座| 宽城| 罗源县| 奎屯市| 宜春市| 长子县| 隆昌县| 柞水县| 平顶山市| 浦城县| 凤阳县| 乌鲁木齐县| 大丰市| 册亨县| 阳泉市| 高邑县| 怀化市| 临汾市| 武夷山市| 青海省| 平顶山市| 澜沧| 垣曲县| 新源县| 安吉县| 土默特右旗|