亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2019-10-29 21:08:06
字體:
來源:轉載
供稿:網友

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

實現基于微軟賬戶的第三方身份驗證

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

ASP.NET,Identity,身份驗證

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

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

組件安裝及Key申請

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

  ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

創建過程如下:

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

  ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

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

ASP.NET,Identity,身份驗證

  ASP.NET,Identity,身份驗證

 4. 保存更改。

添加中間件

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

  ASP.NET,Identity,身份驗證

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

ASP.NET,Identity,身份驗證  

添加Controller及頁面的功能支持

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

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

  ASP.NET,Identity,身份驗證

  ASP.NET,Identity,身份驗證

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

   ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證 

運行結果:

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

ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

  ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

輸入郵箱后將登錄成功:

  ASP.NET,Identity,身份驗證

數據庫中的信息:

  ASP.NET,Identity,身份驗證

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

ASP.NET,Identity,身份驗證

實現雙因子身份驗證

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

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

1. 實現信息的發送:
在ASP.NET MVC默認的模板中就為我們創建了如下代碼:

ASP.NET,Identity,身份驗證

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

   ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

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

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

  ASP.NET,Identity,身份驗證

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

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

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

ASP.NET,Identity,身份驗證

6. 運行結果:

登錄后需要選擇驗證碼發送方式:

ASP.NET,Identity,身份驗證

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

  ASP.NET,Identity,身份驗證

  ASP.NET,Identity,身份驗證

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

ASP.NET,Identity,身份驗證

  ASP.NET,Identity,身份驗證

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

驗證碼機制

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

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

  ASP.NET,Identity,身份驗證

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

ASP.NET,Identity,身份驗證

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

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

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

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

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

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

ASP.NET,Identity,身份驗證

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

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

ASP.NET,Identity,身份驗證

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

ASP.NET,Identity,身份驗證

ASP.NET,Identity,身份驗證

ASP.NET,Identity,身份驗證

小結  

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

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

 

注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美丰满老妇厨房牲生活| 欧美国产日本高清在线| 国产国语videosex另类| 国产一区二区丝袜高跟鞋图片| 久久久人成影片一区二区三区| 成人美女av在线直播| 日韩精品视频免费| 91精品久久久久久久| 欧美一级视频免费在线观看| 欧美一级片免费在线| 亚洲a在线观看| 亚洲精品美女在线观看| 自拍偷拍亚洲区| 亚洲香蕉成视频在线观看| 亚洲日本成人网| 91国产在线精品| 欧美日韩在线一区| 欧美大成色www永久网站婷| 国产999精品久久久影片官网| 欧美在线视频免费观看| 色综合色综合久久综合频道88| 国产一区二区三区三区在线观看| 久久久久久久久久久免费精品| 精品国产91久久久久久老师| 国产亚洲欧美日韩精品| 亚洲精品电影在线观看| 国产综合在线看| 亚洲第一福利在线观看| 亚洲va欧美va国产综合剧情| 国产做受69高潮| 亚洲成色777777在线观看影院| 国产精品爽黄69| 亚洲男人第一网站| 欧美激情喷水视频| 亚洲第一福利网站| 色播久久人人爽人人爽人人片视av| 亚洲mm色国产网站| 国产又爽又黄的激情精品视频| 91精品视频大全| 亚洲影视九九影院在线观看| 日韩精品免费在线播放| 在线观看日韩专区| 丝袜一区二区三区| 亚洲美女av黄| 亚洲美腿欧美激情另类| 欧美激情a∨在线视频播放| 8x海外华人永久免费日韩内陆视频| 中文字幕亚洲一区二区三区五十路| 午夜精品一区二区三区av| 91chinesevideo永久地址| 国产精品一区二区三区毛片淫片| 久久久免费电影| 精品视频在线播放免| 亚洲欧美日韩网| 国产精品91久久久久久| 日韩高清有码在线| 亚洲欧美日韩网| 视频直播国产精品| 日韩av免费一区| 国产精品国产三级国产aⅴ9色| 九九精品在线观看| 成人中心免费视频| 亚洲天堂av电影| 欧美激情国产高清| 在线视频国产日韩| 久久久噜噜噜久久| 亚洲深夜福利网站| 精品一区二区三区电影| 7777精品视频| 亚洲久久久久久久久久| 国产日韩专区在线| 国产日韩在线看片| 午夜免费日韩视频| 亚洲一区中文字幕在线观看| 亚洲欧洲在线免费| 不卡伊人av在线播放| 欧洲亚洲免费视频| 在线精品视频视频中文字幕| 久久免费观看视频| 久久精品国产v日韩v亚洲| 久久久久久久一区二区| 国产欧美日韩综合精品| 成人网欧美在线视频| 欧美xxxx做受欧美.88| 青青草一区二区| 国产精品1234| 欧美激情高清视频| 亚洲一区二区三区视频| 国产精品免费小视频| 日韩专区在线播放| 国产精品欧美一区二区| 欧美激情精品久久久久久大尺度| 国产精品一二三视频| 麻豆成人在线看| 欧美亚洲另类制服自拍| 国产精品欧美一区二区| 91免费高清视频| 97在线精品视频| 亚洲第一精品夜夜躁人人爽| 亚洲欧洲xxxx| 欧美成人激情视频免费观看| 国产美女高潮久久白浆| 91av在线国产| 亚洲全黄一级网站| 91精品免费久久久久久久久| 亚洲国产97在线精品一区| 第一福利永久视频精品| 不卡中文字幕av| 国产mv免费观看入口亚洲| 日韩三级影视基地| 在线成人激情视频| 全球成人中文在线| 欧美激情综合亚洲一二区| 亚洲国产成人一区| 成人黄色av网站| 亚洲免费电影在线观看| 国产精品人人做人人爽| 91精品国产91久久久久久吃药| 亚洲国产精品久久91精品| 日韩亚洲精品电影| 欧美一乱一性一交一视频| 国产精品高清在线观看| 亚洲精品日韩丝袜精品| 亚洲肉体裸体xxxx137| 欧美精品性视频| 啊v视频在线一区二区三区| 精品免费在线观看| 性色av一区二区三区在线观看| 欧美日韩第一视频| 亚洲电影成人av99爱色| 国产精品扒开腿爽爽爽视频| 国产男女猛烈无遮挡91| 91免费观看网站| 国产成人在线亚洲欧美| 成人国产精品av| 精品久久久久久久久久| 欧美成人一区二区三区电影| 色诱女教师一区二区三区| 国产精品美女主播在线观看纯欲| 中文字幕欧美亚洲| 国产婷婷97碰碰久久人人蜜臀| 欧美亚洲成人网| 欧美国产视频日韩| 成人免费看黄网站| 精品国偷自产在线视频99| 成人美女av在线直播| 精品无码久久久久久国产| 5252色成人免费视频| 国产精品中文字幕在线| 在线丨暗呦小u女国产精品| 久久久久久欧美| 国产精品欧美一区二区三区奶水| 欧美在线视频播放| 国产精品jizz在线观看麻豆| 在线精品国产欧美| 国模视频一区二区三区| 日韩欧美一区二区三区久久| 国模gogo一区二区大胆私拍| 国产v综合v亚洲欧美久久| 中文字幕亚洲欧美在线| 亚洲精品视频在线播放| 亚洲xxxx做受欧美| 亚洲免费视频一区二区| 日本不卡高字幕在线2019|