IdentityServer Topics(5)- 使用第三方登入
ASP.NET Core 有一個靈活的方式來處理外部認證,有如下幾個步驟:
如果你使用了 ASP.NET Identity,ASP.NET Identity 對於許多底層程式碼都做了封裝, 建議閱讀Microsoft文件並檢視ASP.NET Identity快速入門原始碼,以此來充分了解 ASP.NET Identity。
一.新增外部認證處理程式
與外部認證提供者互動所需的協議實現被封裝在一個認證處理程式中。 一些提供者使用專有協議(例如Facebook等社交提供者),一些使用標準協議, OpenID Connect,WS-Federation或SAML2p。
請參閱此快速入門以瞭解新增外部認證並對其進行配置的分步說明。
二.cookies的作用
外部認證處理程式上的一個設定 SignInScheme
,例如:
services.AddAuthentication()
.AddGoogle("Google", options =>
{
options.SignInScheme = "scheme of cookie handler to use";
options.ClientId = "...";
options.ClientSecret = "...";
})
登入 scheme
指定將暫時儲存外部認證的結果的cookie處理程式的名稱,例如 由外部提供商傳送的身份資訊單元(Claim)。 這是必要的,因為在完成外部認證過程之前,通常會有幾個重定向(比如QQ登入的跳轉)。
鑑於這是一種常見的做法,IdentityServer 專門為此外部提供程式工作流程註冊一個Cookie處理程式。 該方案通過IdentityServerConstants.ExternalCookieAuthenticationScheme
常量表示。 如果你要使用 IdentityServer 提供外部cookie處理程式,那麼對於上面的SignInScheme
,預設值為IdentityServerConstants.ExternalCookieAuthenticationScheme
常量:
services.AddAuthentication() .AddGoogle("Google", options => { options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; options.ClientId = "..."; options.ClientSecret = "..."; })
您也可以註冊您自己的自定義Cookie處理程式,如下所示:
services.AddAuthentication()
.AddCookie("YourCustomScheme")
.AddGoogle("Google", options =>
{
options.SignInScheme = "YourCustomScheme";
options.ClientId = "...";
options.ClientSecret = "...";
})
對於特定的場景,你可以不使用外部Cookie機制,將外部使用者直接轉發到主要Cookie處理程式。 這通常涉及在外部處理程式上處理事件,以確保從外部身份源執行正確的身份資訊(Claim)轉換。
三. 觸發認證
你可以通過HttpContext
上的ChallengeAsync
擴充套件方法(或使用MVC ChallengeResult)呼叫外部認證處理程式。
如果傳遞某些設定,比如: returnUrl和scheme可以這樣設定:
var callbackUrl = Url.Action("ExternalLoginCallback");
var props = new AuthenticationProperties
{
RedirectUri = callbackUrl,
Items =
{
{ "scheme", provider },
{ "returnUrl", returnUrl }
}
};
return Challenge(provider, props);
四. 回撥處理程式和使用者簽名
在回撥頁面上,通常任務是:
- 檢查由外部提供商返回的身份。
- 如果處理使用者,對於已存在的使用者和新使用者的處理是不同的
- 新使用者在登入可能需要額外的步驟和UI介面。
- 可能會建立一個內部賬戶來繫結外部身份
- 儲存你要保留的外部身份資訊單元(Claim)。
- 刪除臨時cookie
- 登入使用者
** 檢查外部身份:**
// read external identity from the temporary cookie
var result = await HttpContext.AuthenticateAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
throw new Exception("External authentication error");
}
// retrieve claims of the external user
var externalUser = result.Principal;
if (externalUser == null)
{
throw new Exception("External authentication error");
}
// retrieve claims of the external user
var claims = externalUser.Claims.ToList();
// try to determine the unique id of the external user - the most common claim type for that are the sub claim and the NameIdentifier
// depending on the external provider, some other claim type might be used
var userIdClaim = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Subject);
if (userIdClaim == null)
{
userIdClaim = claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
}
if (userIdClaim == null)
{
throw new Exception("Unknown userid");
}
var externalUserId = userIdClaim.Value;
var externalProvider = userIdClaim.Issuer;
// use externalProvider and externalUserId to find your user, or provision a new user
** 清理和登入:**
// issue authentication cookie for user
await HttpContext.SignInAsync(user.SubjectId, user.Username, provider, props, additionalClaims.ToArray());
// delete temporary cookie used during external authentication
await HttpContext.SignOutAsync(IdentityServerConstants.ExternalCookieAuthenticationScheme);
// validate return URL and redirect back to authorization endpoint or a local page
if (_interaction.IsValidReturnUrl(returnUrl) || Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
return Redirect("~/");
五.State,URL Length和ISecureDataFormat
當重定向到外部登入時,來自客戶端應用程式的狀態必須頻繁進行往返。 這意味著狀態在離開客戶端之前被捕獲並儲存直到使用者返回到客戶端應用程式。 許多協議(包括OpenID Connect)都允許將某種狀態作為引數傳遞,身份提供者將在響應中返回該狀態。 ASP.NET Core提供的OpenID Connect身份驗證處理程式利用了該協議的這一功能,這就是它如何實現上述的returnUrl功能。
在請求引數中儲存狀態的問題是請求URL可能會變得太大(超過2000個字元的公共限制)。 OpenID Connect身份驗證處理程式的確提供了一個可擴充套件點,用於將狀態儲存在伺服器中,而不是在請求URL中。 您可以通過實現ISecureDataFormat
幸運的是,IdentityServer為您提供了一個實現,由在DI容器中註冊的IDistributedCache
實現(例如,獨立的MemoryDistributedCache
)支援。 要使用IdentityServer提供的安全資料格式實現,只需在配置DI時在IServiceCollection上呼叫AddOidcStateDataFormatterCache
擴充套件方法即可。 如果沒有引數傳遞,則所有配置的OpenID Connect處理程式將使用IdentityServer提供的安全資料格式實現:
public void ConfigureServices(IServiceCollection services)
{
// configures the OpenIdConnect handlers to persist the state parameter into the server-side IDistributedCache.
services.AddOidcStateDataFormatterCache();
services.AddAuthentication()
.AddOpenIdConnect("demoidsrv", "IdentityServer", options =>
{
// ...
})
.AddOpenIdConnect("aad", "Azure AD", options =>
{
// ...
})
.AddOpenIdConnect("adfs", "ADFS", options =>
{
// ...
});
}
如果只配置特定方案,則將這些方案作為引數傳遞:
public void ConfigureServices(IServiceCollection services)
{
// configures the OpenIdConnect handlers to persist the state parameter into the server-side IDistributedCache.
services.AddOidcStateDataFormatterCache("aad", "demoidsrv");
services.AddAuthentication()
.AddOpenIdConnect("demoidsrv", "IdentityServer", options =>
{
// ...
})
.AddOpenIdConnect("aad", "Azure AD", options =>
{
// ...
})
.AddOpenIdConnect("adfs", "ADFS", options =>
{
// ...
});
}
相關推薦
IdentityServer Topics(5)- 使用第三方登入
ASP.NET Core 有一個靈活的方式來處理外部認證,有如下幾個步驟: 如果你使用了 ASP.NET Identity,ASP.NET Identity 對於許多底層程式碼都做了封裝, 建議閱讀Microsoft文件並檢視ASP.NET Identity快速入門原始碼,以此來充分了解 ASP.NET I
Django 專案總結(3)- 第三方登入(QQ登入)
第三方登入(QQ 登入) 根據 qq 開發文件 oauth2.0 QQ 登入流程: 前端頁面點選 QQ 登入,需要跳轉到 QQ 的登入頁面,但是前端不知道 QQ 的登入連結,所以先想後端傳送請求,由伺服器生成 QQ 登入頁地址,返回給前端; 使用者在
IdentityServer Topics(1)- 啟動說明
原文: IdentityServer Topics(1)- 啟動說明 啟動 IdentityServer的啟動是中介軟體和服務的組合來實現的。 所有配置都在你的啟動類(Startup.cs)中完成。 配置服務 通過以下方式呼叫將IdentityServer服務新增到DI系統: public void
IdentityServer Topics(2)- 定義資源
原文: IdentityServer Topics(2)- 定義資源 您通常在系統設計中的第一件事就是您要保護的資源。 這可能是您的使用者的身份資訊,如個人資料資料或電子郵件地址,或訪問API。 您可以使用C#物件模型定義資源(硬編碼),或從資料儲存中載入它們。 IResourceStore的實現處
IdentityServer Topics(6)- Windows身份驗證
在Windows平臺上,你可以讓IdentityServer使用 Windows身份驗證 對使用者進行身份驗證。 當你使用以下型別託管執行 IdentityServer 時, Windows身份驗證功能可用: 使用Kestrel伺服器但需要使用IIS integration或者IIS 使用HTTP.sys伺
爬蟲的編譯器的安裝,pycharm第三方庫的安裝和pip的安裝,爬蟲認知篇(5)
python之所以強大並逐漸流行起來,一部分原因要歸功於的Python的強大的第三方庫。這樣使用者就不用瞭解底層的思想,用最少的程式碼寫出最多的功能。  
爬蟲入門,從第一個爬蟲建立起做蟲師的心,爬蟲的編譯器的安裝,pycharm第三方庫的安裝和pip的安裝,爬蟲的認知篇(5)
Python之所以強大並逐漸流行起來,一部分原因要歸功於Python強大的第三方庫。這樣使用者就不用瞭解底層的思想,用最少的程式碼寫出最多的功能。 在PyCharm中安裝
Go語言入門(5)安裝第三方庫
通過go get 去獲取github上的第三方庫是沒什麼問題的,但是要獲取google的就不行了,沒辦法, 所以我們通過gopm這個工具來獲取Google的第三方庫 1. 安裝gopm go get g
CAS單點登入(5):相關參考資料
目錄 目錄 github地址: 較完整的教程CSDN 學習總結 第三方登入 其他 github地址: https://github.com/apereo/cas https://g
IdentityServer(15)- 第三方快速入門和示例
原文: IdentityServer(15)- 第三方快速入門和示例 這些示例不由IdentityServer團隊維護。 IdentityServer團隊提供連結到了社群示例,但不能對示例做任何保證。 如有問題,請直接與作者聯絡。 各種ASP.NET Core安全示例 https://github.co
微信小程式之登入頁例項 —— 微信小程式實戰系列(5)
提供一個登入頁的案例,供同學們使用 專案效果圖: 目錄結構: 圖片資源: name.png key.png loginLog.jpg login.wxml: <view c
Laravel5.5 搭建簡單的社群(五)--使用者登入
定義一條登入的路由: // 使用者登入 Route::get('/user/login', '[email protected]'); 新增相應方法後返回檢視: public function login() { retu
HBuilder mui入門教程——(5)登入和訪問控制
mui中提供了登入的模板頁,但是對於登入後各個頁面的訪問控制,重新整理等並沒有官方的推薦方案。我在這裡簡單說一種初級的解決方案吧,肯定有不足指出,歡迎批評指正。 第一節中建立移動APP專案的時候選擇的是"mui專案",只引入了預設的js和css等檔案,沒有登入
程序猿的量化交易之路(17)--Cointrader之Temporal實體(5)
eas 建表 times create bject cloud temp 存儲 時間 轉載須要註明:http://blog.csdn.net/minimicall,http://cloudtrader.top/ 這一小節說明一個時間實體Temporal實體,它的代碼非常
C++傳智筆記(5):C++完整demo
內部 urn else clas spa char log getx system MyPoint.h #pragma once class MyPoint { private: double x0, y0; //點坐標 public: void setPoint(d
Windows Phone開發(5):室內裝修
表示 index can 進行 解釋 技術 面板 啟動 垂直 為什麽叫室內裝修呢?呵呵,其實說的是布局,具體些嘛,就是在一個頁面中,你如何去擺放你的控件,如何管理它們,你說,像不像我們剛搬進新住所,要“裝修”一番?買一套什麽樣的茶幾和杯具(我說的“杯具”指的是原意,不要理解
構建之法——讀書筆記(5)
exp 時間 微軟 padding 層次結構 敏捷 參加 解決問題 企業 第七章 MSF What is MSF?——Microsoft Solution Framework(微軟解決方案框架)即一個方法論,也就是微軟推薦的軟件開發方法。 MSF基本原則: MSF沒有像敏捷
構建之法學習(5)
成員 nbsp 9.png 多少 影響 .cn ges png img 本周學習的是構建之法第五章 團隊和流程 團隊有共同的特點:1. 團隊有一致的集體目標,團隊要一起完成這目標。一個團隊的成員不一定要同時工作,例如接力賽跑。(王屋村搬磚的“非團隊”成員則不然,每個人想搬多
網絡構建入門技術(5)——子網劃分應用
掩碼 -1 參考資料 臺電 www 說明 網絡 com hive 說明(2017-5-16 11:27:00): 題目: 一個公司有530臺電腦,組成一個對等局域網,子網掩碼和IP設多少最合適? 1. 首先選IP地址類別,A類太多,C類不夠用,就選B類了,假設為188.18
直播疑難雜癥排查(5)— 音畫不同步
直播 疑難雜癥 采集 時間戳 音畫同步 本文是 《直播疑難雜癥排查》系列的第五篇文章,我們重點來看看直播中常見的音畫不同步問題。1. 音畫不同步的表現很容易判斷,就是畫面和聲音不匹配。2. 音畫同步的基礎概念首先我們要明白一個概念,雖然人的肉眼,很容易辨別音畫是否同步的,但是機器則不然,對