Identity Service - 解析微软微服务架构eShopOnContainers(二)
接上一篇,眾所周知一個(gè)網(wǎng)站的用戶登錄是非常重要,一站式的登錄(SSO)也成了大家討論的熱點(diǎn)。微軟在這個(gè)Demo中,把登錄單獨(dú)拉了出來,形成了一個(gè)Service,用戶的注冊(cè)、登錄、找回密碼等都在其中進(jìn)行。
這套service是基于IdentityServer4開發(fā)的, 它是一套基于 .Net Core的OAuth2和OpenID框架,這套框架目前已經(jīng)很完善了,我們可以把它使用到任何項(xiàng)目中。
我們先看下目錄結(jié)構(gòu):
frameborder="0" scrolling="no" style="border-width: medium; width: 470px; height: 421px;">
從目錄結(jié)構(gòu)可以看出它是一套MVC架構(gòu)的網(wǎng)站,我們可以單獨(dú)進(jìn)行運(yùn)行和調(diào)試,當(dāng)然,我們也可以把它放進(jìn)自己的項(xiàng)目中。
從.Net Core開始,我們看代碼的順序從Web.config轉(zhuǎn)到了Program.cs中,我們來看下IdentityService的Program:
public class Program { public static void Main(string[] args){var host = new WebHostBuilder().UseKestrel().UseHealthChecks("/hc") //多了一個(gè)健康檢查.UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();host.Run();} }跟普通的.Net Core項(xiàng)目類似,不過多了一個(gè)UseHealthChecks,從名字上也能看出,這是一個(gè)對(duì)項(xiàng)目健康的檢查,有興趣的話到時(shí)候我們另外開篇介紹。看完P(guān)rogram我們看下Startup
在初始化的時(shí)候,我們看到的代碼基本與系統(tǒng)相同,多了一個(gè)加入builder.AddUserSecrets(), 這是一個(gè)用戶信息加密方法,避免我們?cè)谔峤还蚕眄?xiàng)目的時(shí)候,會(huì)把自己一些重要信息泄露,有興趣的朋友可以看下Secret Manager Tools。
在ConfigureServices中,我們看到有一段代碼:
services.AddDataProtection(opts => {opts.ApplicationDiscriminator = "eshop.identity"; });這段代碼意思是加了一個(gè)唯一標(biāo)示符給應(yīng)用程序,這在集群環(huán)境中是非常必要的,我們可以通過這個(gè)唯一標(biāo)識(shí)來判斷是否是同一個(gè)應(yīng)用(我們的同一應(yīng)用可能會(huì)分布在不同server上),具體可以看園內(nèi)大神的專題:Asp.Net Core 數(shù)據(jù)保護(hù)
Going Down:
services.AddHealthChecks(checks => {var minutes = 1;if (int.TryParse(Configuration["HealthCheck:Timeout"], out var minutesParsed)){minutes = minutesParsed;}checks.AddSqlCheck("Identity_Db", Configuration.GetConnectionString("DefaultConnection"),
TimeSpan.FromMinutes(minutes)); });
又是Health檢查,這次檢查了與數(shù)據(jù)庫連接的狀態(tài)。
services.AddTransient<IEmailSender, AuthMessageSender>();//郵件發(fā)送服務(wù)
services.AddTransient<ISmsSender, AuthMessageSender>();
//短信發(fā)送服務(wù)
services.AddTransient<ILoginService<ApplicationUser>, EFLoginService>();
//EF 登錄服務(wù)
services.AddTransient<IRedirectService, RedirectService>();
//重定向服務(wù)//callbacks urls from config:
Dictionary<string, string> clientUrls = new Dictionary<string, string>(); clientUrls.Add("Mvc", Configuration.GetValue<string>("MvcClient")); clientUrls.Add("Spa", Configuration.GetValue<string>("SpaClient")); clientUrls.Add("Xamarin", Configuration.GetValue<string>("XamarinCallback"));
// Adds IdentityServerservices.AddIdentityServer(x => x.IssuerUri = "null").AddSigningCredential(Certificate.Get()).AddInMemoryApiResources(Config.GetApis()).AddInMemoryIdentityResources(Config.GetResources()).AddInMemoryClients(Config.GetClients(clientUrls)).AddAspNetIdentity<ApplicationUser>().Services.AddTransient<IProfileService, ProfileService>();
為identityserver4 進(jìn)行相關(guān)配置。Startup中的Configure沒什么特別的。
簡單的看了下Identity項(xiàng)目,好像就是教你怎么使用IdentityServer4,So,你可以在博客園中找到好多相關(guān)資料,這里就不重復(fù)介紹了。
在這個(gè)service中,發(fā)現(xiàn)了很多沒有用到的類和屬性,估計(jì)是為了以后擴(kuò)展用的吧。
例如:
var user = await _loginService.FindByUsername(model.Email);if (await _loginService.ValidateCredentials(user, model.Password)) {AuthenticationProperties props = null; if (model.RememberMe){props = new AuthenticationProperties{IsPersistent = true,ExpiresUtc = DateTimeOffset.UtcNow.AddYears(10)};};await _loginService.SignIn(user);
// make sure the returnUrl is still valid, and if yes - redirect back to authorize endpointif (_interaction.IsValidReturnUrl(model.ReturnUrl)){ return Redirect(model.ReturnUrl);} return Redirect("~/"); }
這是AccountController用戶登錄的一段代碼,其中的props屬性進(jìn)行了設(shè)置,但是在后面沒有使用到,因?yàn)槭菫橐院笾С殖掷m(xù)化登錄做的準(zhǔn)備吧。還有在Services目錄中的ProfileService,在項(xiàng)目中也沒有進(jìn)行調(diào)用,相信在后面的版本中會(huì)加上去的。
運(yùn)行部署
了解了項(xiàng)目后,我們?cè)賮磉M(jìn)行運(yùn)行和部署。
首先,我們需要一臺(tái)MSSQL Server,因?yàn)槲覀冃枰4嬗脩魯?shù)據(jù),建議用SQL 2008 update3以上,為何用update3以上后面會(huì)說,當(dāng)然你也可以使用其他類型的數(shù)據(jù)庫,比如MySql,Sqlite等。
其次,把Identity項(xiàng)目設(shè)置為啟動(dòng)項(xiàng)目,試著Ctrl+F5運(yùn)行,看看是否運(yùn)行成功。
當(dāng)你能在瀏覽器看到這個(gè)頁面的時(shí)候,說明程序運(yùn)行正常,配置也正確,接下來看下如何在docker中運(yùn)行。
1、右鍵項(xiàng)目-發(fā)布,把項(xiàng)目編譯發(fā)布到某個(gè)文件夾中。
2、打開你的終端,如果是win10之前的系統(tǒng),請(qǐng)打開Docker Quickstart Terminal
我用的是win7,使用的是Quickstart終端,其他系統(tǒng)只要是使用linux container的都一樣,否則怎么叫“build once, run anywhere”呢。
3、在終端上先cd到你的發(fā)布目錄,如果不在同一個(gè)驅(qū)動(dòng)器下的,使用 /(driver)/ 代替driver:,例如,我的項(xiàng)目發(fā)布在D:\Projects\publish
cd /d/projects/publish在你的終端看到輸入處上一行有這個(gè)目錄的,說明你已經(jīng)進(jìn)入到這個(gè)目錄了,如:
4、用ls查看下這個(gè)目錄,你會(huì)看到編譯后的文件都在這里(release),在文件夾中,你會(huì)看到dockerfile文件,這個(gè)相當(dāng)于docker的批處理文件,我們看下內(nèi)容,具體如何寫,可以看博客園中其他大神的教程:
FROM microsoft/aspnetcore:1.1 ARG source WORKDIR /app EXPOSE 80 COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "Identity.API.dll"]5、在終端運(yùn)行docker build命令,創(chuàng)建你的image(請(qǐng)注意最后的“.”,這個(gè)代表的當(dāng)前目錄):
docker build -t identity:01 .6、成功后,我們使用docker images 可以查看,如果在list中有identity的話,說明我們創(chuàng)建成功了
7、run起來
ok,所有操作完畢,可以用我們的瀏覽器打開,輸入http://localhost:8888了
撒都沒有,撒情況!!!!
通過檢查,終于知道了原因,我們使用的docker-toolbox,所以它會(huì)借助于VritualBox來創(chuàng)建一個(gè)linux運(yùn)行環(huán)境,所以我們必須把虛擬機(jī)中的端口映射到我的本機(jī)!
想著這下總歸可以了吧,誰知道。。。。。還是無法訪問,在quickstart中,我輸入了docker logs identity 看到如下日志:
這什么鬼,time out!!可我iis運(yùn)行都是正常的啊,不存在數(shù)據(jù)庫連接不上的問題吧!這個(gè)問題足足困擾了我2天,晚上也睡不好,第3天早上,突然想到會(huì)不會(huì)linux容器的關(guān)系呢?之前google的都是錯(cuò)誤信息,所以撒都沒有搜出來,我改了下關(guān)鍵字 linux containers connection sqlserver,果不其然,在一個(gè)issue中發(fā)現(xiàn)了答案:
https://github.com/aspnet/EntityFramework/issues/4702#issuecomment-193382793
原來我們的sql2008沒有支持這種登錄request,我們必須升級(jí)到update3才能解決這個(gè)問題,為了讓教程繼續(xù),我購買了azure的1元試用,更換了connection后,我重新build和run,終于看到了熟悉的頁面:
寫在最后
在Identity Service中,我們看到了一些新的東西,比如secret manager tool,healthcheck等,雖說它是基于identityServer4搭建的,但至少它教會(huì)了我們?nèi)绾问褂胕dentityServer4,而且我們完全可以單獨(dú)把它拉出來作為我們自己的user server,我也是第一次接觸IdentityServer4,以后大家可以一起學(xué)習(xí)討論下,感覺非常強(qiáng)大。最后我們學(xué)習(xí)了如何單獨(dú)搭建和部署identity service,并使其能夠在docker中正常運(yùn)行。
相關(guān)文章:
開篇有益-解析微軟微服務(wù)架構(gòu)eShopOnContainers(一)
原文地址:http://www.cnblogs.com/inday/p/identity-service-eshoponcontainers.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的Identity Service - 解析微软微服务架构eShopOnContainers(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于OAuth2的认证(译)
- 下一篇: 码农不重视文档:开源项目深受其苦