asp.net core 外部认证多站点模式实现
PS:之前因?yàn)樾枰獢U(kuò)展了微信和QQ的認(rèn)證,使得網(wǎng)站是可以使用QQ和微信直接登錄。github 傳送門(mén)?。然后有小伙伴問(wèn),能否讓這個(gè)配置信息(appid, appsecret)按需改變,而不是在 ConfigureServices ?里面寫(xiě)好。
先上 官方文檔 :??https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/social/?view=aspnetcore-2.1?
官方已經(jīng)實(shí)現(xiàn)了 microsft,facebook,twitter,google 等這幾個(gè)網(wǎng)站認(rèn)證。代碼可以認(rèn)證授權(quán)庫(kù)看到找到?https://github.com/aspnet/Security? 。
國(guó)內(nèi)的QQ和微信其實(shí)也是基于OAuth來(lái)實(shí)現(xiàn)的,所以自己集成還是比較容易。
正常情況下,配置這個(gè)外部認(rèn)證都是在 ConfigureServices 里面配置好,并且使用配置或者是使用機(jī)密文件的形式來(lái)保存 appid 等信息。
回到正文,多站點(diǎn)模式,就是一個(gè)網(wǎng)站下分為多個(gè)子站點(diǎn),并且不同的子站點(diǎn)可以配置不同的appId 。Asp.net core 默認(rèn)的配置模式,在這種場(chǎng)景下已經(jīng)適應(yīng)不了了。
先上代碼:?https://github.com/jxnkwlp/AspNetCore.AuthenticationQQ-WebChat/tree/muti-site
官方代碼分析:
1,RemoteAuthenticationHandler? 遠(yuǎn)程認(rèn)證處理程序。位于 microsoft.aspnetcore.authentication? 下 。 源碼 (https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication/RemoteAuthenticationHandler.cs)
這個(gè)是泛型類(lèi),并且需要一個(gè)? TOptions ,這個(gè) TOptions 必須是繼承 RemoteAuthenticationOptions 的類(lèi)。?
2,OAuthHandler 實(shí)現(xiàn) OAuth 認(rèn)證處理程序,這個(gè)類(lèi)繼承 RemoteAuthenticationHandler 。同時(shí)必須實(shí)現(xiàn)一個(gè) OAuthOptions 。
正常情況下實(shí)現(xiàn) QQ、微信、github ,google ,facebook 等登錄都是基于這個(gè)來(lái)實(shí)現(xiàn)的。 OAuthHandler 已經(jīng)實(shí)現(xiàn)了標(biāo)準(zhǔn)的 OAuth 認(rèn)證。
源碼:https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication.OAuth/OAuthHandler.cs
在 ConfigureServices 中,使用? AddFacebook 等方法,就是將 對(duì)于的 Handler 添加到 處理管道中,這些管到都是實(shí)現(xiàn)了 OAuth,然后傳遞 對(duì)應(yīng)的 Options 來(lái)配置Handler 。?
3,回到Account/ExternalLogin ,在提交外部登錄的請(qǐng)求中, AuthenticationProperties? properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl); ?//這行代碼的作用是 配置當(dāng)前外部登錄返回URL和認(rèn)證的相關(guān)屬性。return Challenge(properties, provider); ?// 將結(jié)果轉(zhuǎn)到相關(guān)相關(guān)處理程序。這里返回的結(jié)果用于上面? OAuthHandler 作為一個(gè)處理參數(shù)。從這開(kāi)始,就進(jìn)入了 OAuthHandler 的處理范圍了。
?
4,查看 OAuthHandler 代碼 。? Task HandleChallengeAsync(AuthenticationProperties properties);? 這個(gè)函數(shù)作為接收上一步中傳遞的 認(rèn)證參數(shù)。 ??默認(rèn)實(shí)現(xiàn)代碼:
在這里面,構(gòu)建了一個(gè)請(qǐng)求URL, 要求的這個(gè)URL 是目標(biāo)站點(diǎn)授權(quán)的URL, 比如微信的那個(gè)黑色背景中間有二維碼的頁(yè)面。? 這個(gè)構(gòu)建請(qǐng)求URL的方法可以重寫(xiě)。
5,在上一步中,在需要授權(quán)的網(wǎng)站,授權(quán)完成后,會(huì)跳轉(zhuǎn)到自己的網(wǎng)站并且?guī)鲜跈?quán)相關(guān)數(shù)據(jù)。入口是? Task<HandleRequestResult> HandleRemoteAuthenticateAsync();??
改造方法:
在上面的分析中,官方的實(shí)現(xiàn)是 在 ConfigureServices 中配置好參數(shù) TOptions ,然后在 Handler 中 獲取該參數(shù)。我們的目的是在請(qǐng)求中可以按需改變參數(shù),如 client_id。
1,定義一個(gè)接口 IClientStore 和 一個(gè)實(shí)體 ClientStoreModel 。
IClientStore 用于查找 client 的配置信息
2,在 Account/ExternalLogin 中,新增一個(gè) 參數(shù) subjectId? ,表示在當(dāng)前某個(gè)認(rèn)證(Provider)中是哪個(gè)請(qǐng)求(SubjectId) 。
同時(shí)在返回的授權(quán)配置參數(shù)中將subjectId 保存起來(lái)。
?
3,定義一個(gè) MultiOAuthHandler ,集成 RemoteAuthenticationHandler? ,不繼承? OAuthHandler 是因?yàn)?這里需要一個(gè)新的 Options.? (完整代碼 請(qǐng)看代碼倉(cāng)庫(kù))? 定義: class MultiOAuthHandler<TMultiOAuthOptions>:RemoteAuthenticationHandler<TMultiOAuthOptions>whereTMultiOAuthOptions:MultiOAuthOptions,new()?
在構(gòu)造函數(shù)中添加參數(shù) IClientStore 。
4,在默認(rèn)的實(shí)現(xiàn)中,從外部授權(quán)網(wǎng)站跳轉(zhuǎn)回自己的網(wǎng)站的時(shí)候,默認(rèn)的路徑是 /signin-{provider} , 比如 /signin-microsoft? 。為了區(qū)分請(qǐng)求的 subjectId ,? 這個(gè)默認(rèn)路徑將改為? /signin-{provider}/subject/{subjectId} ?。
5,修改 HandleRemoteAuthenticateAsync? ,在開(kāi)頭添加2行代碼,用于獲取 subjectId 。
var callbackPath = Options.CallbackPath.Add("/subject").Value;var subjectId = Request.Path.Value.Remove(0, callbackPath.Length + 1);?
6,修改 ExchangeCodeAsync 方法
7,還有一些小修改,就不一一列出來(lái)了。? 到這里? MultiOAuthHandler? 相關(guān)就調(diào)整好了。
我把這個(gè)單獨(dú)出來(lái)了??Microsoft.AspNetCore.Authentication.MultiOAuth??
8,使用 。 實(shí)現(xiàn) IClientStore 接口,然后在 ConfigureServices? 中添加如下代碼:
| services.AddAuthentication()????.AddMultiOAuthStore<MylientStore>() ????.AddMultiWeixinAuthentication(); // 微信 |
?
9, 目前github 上的demo 只對(duì) 微信? 做了實(shí)現(xiàn)。
原文地址:?https://www.cnblogs.com/passingwind/p/9511022.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的asp.net core 外部认证多站点模式实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .net core 生成二维码
- 下一篇: .NET Core使用NLog通过Kaf