HTML5技术

Identity Service - 解析微软微服务架构eShopOnContainers(二) - James.Yin

字号+ 作者:H5之家 来源:H5之家 2017-06-01 17:02 我要评论( )

接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点。微软在这个Demo中,把登录单独拉了出来,形成了一个Service,用户的注册、登录、找回密码等都在其中进行。 这套service是基于IdentityServer4开发的, 它是一套

接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点。微软在这个Demo中,把登录单独拉了出来,形成了一个Service,用户的注册、登录、找回密码等都在其中进行。

这套service是基于IdentityServer4开发的, 它是一套基于 .Net Core的OAuth2和OpenID框架,这套框架目前已经很完善了,我们可以把它使用到任何项目中。

我们先看下目录结构:

image

从目录结构可以看出它是一套MVC架构的网站,我们可以单独进行运行和调试,当然,我们也可以把它放进自己的项目中。

从.Net Core开始,我们看代码的顺序从Web.config转到了Program.cs中,我们来看下IdentityService的Program:

public class Program { Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseHealthChecks("/hc") //多了一个健康检查 .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); } }

跟普通的.Net Core项目类似,不过多了一个UseHealthChecks,从名字上也能看出,这是一个对项目健康的检查,有兴趣的话到时候我们另外开篇介绍。看完Program我们看下Startup

在初始化的时候,我们看到的代码基本与系统相同,多了一个加入builder.AddUserSecrets(), 这是一个用户信息加密方法,避免我们在提交共享项目的时候,会把自己一些重要信息泄露,有兴趣的朋友可以看下Secret Manager Tools。

在ConfigureServices中,我们看到有一段代码:

services.AddDataProtection(opts => { opts.ApplicationDiscriminator = "eshop.identity"; });


这段代码意思是加了一个唯一标示符给应用程序,这在集群环境中是非常必要的,我们可以通过这个唯一标识来判断是否是同一个应用(我们的同一应用可能会分布在不同server上),具体可以看园内大神的专题:Asp.Net Core 数据保护

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检查,这次检查了与数据库连接的状态。

services.AddTransient<IEmailSender, AuthMessageSender>(); //邮件发送服务 services.AddTransient<ISmsSender, AuthMessageSender>(); //短信发送服务 services.AddTransient<ILoginService<ApplicationUser>, EFLoginService>(); //EF 登录服务 services.AddTransient<IRedirectService, RedirectService>(); //重定向服务 //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 IdentityServer services.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 进行相关配置。Startup中的Configure没什么特别的。

简单的看了下Identity项目,好像就是教你怎么使用IdentityServer4,So,你可以在博客园中找到好多相关资料,这里就不重复介绍了。

在这个service中,发现了很多没有用到的类和属性,估计是为了以后扩展用的吧。

例如:

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 endpoint if (_interaction.IsValidReturnUrl(model.ReturnUrl)) { return Redirect(model.ReturnUrl); } return Redirect("~/"); }

这是AccountController用户登录的一段代码,其中的props属性进行了设置,但是在后面没有使用到,因为是为以后支持持续化登录做的准备吧。还有在Services目录中的ProfileService,在项目中也没有进行调用,相信在后面的版本中会加上去的。运行部署

了解了项目后,我们再来进行运行和部署。

首先,我们需要一台MSSQL Server,因为我们需要保存用户数据,建议用SQL 2008 update3以上,为何用update3以上后面会说,当然你也可以使用其他类型的数据库,比如MySql,Sqlite等。

其次,把Identity项目设置为启动项目,试着Ctrl+F5运行,看看是否运行成功。

4、用ls查看下这个目录,你会看到编译后的文件都在这里(release),在文件夹中,你会看到dockerfile文件,这个相当于docker的批处理文件,我们看下内容,具体如何写,可以看博客园中其他大神的教程:

FROM microsoft/aspnetcore:1.1 ARG source WORKDIR /app EXPOSE 80 COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "Identity.API.dll"]

5、在终端运行docker build命令,创建你的image(请注意最后的“.”,这个代表的当前目录):

docker build -t identity:01 .

6、成功后,我们使用docker images 可以查看,如果在list中有identity的话,说明我们创建成功了

7、run起来

docker run -p 8888:80 --name identity -d identity:01

ok,所有操作完毕,可以用我们的浏览器打开,输入:8888了

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 开篇有益-解析微软微服务架构eShopOnContainers(一) - James.Ying

    开篇有益-解析微软微服务架构eShopOnContainers(一) - James.Ying

    2017-05-27 14:00

  • Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析 - Joanna

    Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文

    2017-05-19 14:01

  • 安卓下微信内置浏览器视频出现解析错误 - Chris-dc

    安卓下微信内置浏览器视频出现解析错误 - Chris-dc

    2017-05-13 08:02

  • 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道

    【AngularJS中的自定义服务service VS factory VS provider】---它们

    2017-05-08 13:04

网友点评
h