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

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

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

我们先看下目录结构:

frameborder="0" scrolling="no" style="border-width: medium; width: 470px; height: 421px;">

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

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

public class Program
{    public static void 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 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 进行相关配置。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 endpointif (_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运行,看看是否运行成功。

当你能在浏览器看到这个页面的时候,说明程序运行正常,配置也正确,接下来看下如何在docker中运行。

1、右键项目-发布,把项目编译发布到某个文件夹中。

2、打开你的终端,如果是win10之前的系统,请打开Docker Quickstart Terminal

我用的是win7,使用的是Quickstart终端,其他系统只要是使用linux container的都一样,否则怎么叫“build once, run anywhere”呢。

3、在终端上先cd到你的发布目录,如果不在同一个驱动器下的,使用 /(driver)/ 代替driver:,例如,我的项目发布在D:\Projects\publish

    cd /d/projects/publish

在你的终端看到输入处上一行有这个目录的,说明你已经进入到这个目录了,如:

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,所有操作完毕,可以用我们的浏览器打开,输入http://localhost:8888了

撒都没有,撒情况!!!!

通过检查,终于知道了原因,我们使用的docker-toolbox,所以它会借助于VritualBox来创建一个linux运行环境,所以我们必须把虚拟机中的端口映射到我的本机!

想着这下总归可以了吧,谁知道。。。。。还是无法访问,在quickstart中,我输入了docker logs identity 看到如下日志:

这什么鬼,time out!!可我iis运行都是正常的啊,不存在数据库连接不上的问题吧!这个问题足足困扰了我2天,晚上也睡不好,第3天早上,突然想到会不会linux容器的关系呢?之前google的都是错误信息,所以撒都没有搜出来,我改了下关键字 linux containers connection sqlserver,果不其然,在一个issue中发现了答案:

https://github.com/aspnet/EntityFramework/issues/4702#issuecomment-193382793

原来我们的sql2008没有支持这种登录request,我们必须升级到update3才能解决这个问题,为了让教程继续,我购买了azure的1元试用,更换了connection后,我重新build和run,终于看到了熟悉的页面:


写在最后

在Identity Service中,我们看到了一些新的东西,比如secret manager tool,healthcheck等,虽说它是基于identityServer4搭建的,但至少它教会了我们如何使用identityServer4,而且我们完全可以单独把它拉出来作为我们自己的user server,我也是第一次接触IdentityServer4,以后大家可以一起学习讨论下,感觉非常强大。最后我们学习了如何单独搭建和部署identity service,并使其能够在docker中正常运行。


相关文章:

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

原文地址:http://www.cnblogs.com/inday/p/identity-service-eshoponcontainers.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP协议——ARP详解

转载自 TCP/IP协议——ARP详解 本文主要讲述了ARP的作用、ARP分组格式、ARP高速缓存、免费ARP和代理ARP。 1.学习ARP前要了解的内容 建立TCP连接与ARP的关系 应用接受用户提交的数据&#xff0c;触发TCP建立连接&#xff0c;TCP的第一个SYN报文通过connect函数到达IP层&a…

RPC远程过程调用之 RMI实现

1&#xff09;RMI&#xff08;remote method invocation&#xff09;是java原生支持的远程调用&#xff0c;RMI采用JRMP&#xff08;java RemoteMessageing Protocol&#xff09;作为通信协议。可以认为是纯java版本的分布式远程调用解决方法。 2&#xff09;RMI的核心概念 3&…

[翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量

选择什么来衡量 在搜集数据测试数据前&#xff0c;你需要知道你要以怎样的指标来衡量测试结果。这听起来很容易&#xff0c;但实际上比你想象中的要难许多。如果你想降低内存使用量&#xff0c;你会选择什么方式呢&#xff1f; 私有工作集&#xff08;Private working set&am…

RPC远程过程调用之Hessian 基于HTTP

Hessian使用C/S方式&#xff0c;基于HTTP协议传输&#xff0c;使用Hessian二进制序列化。 添加依赖&#xff1a; <dependency><groupId>com.caucho</groupId><artifactId>hessian</artifactId><version>4.0.7</version> </depen…

EF框架中,在实体中手动更新字段,数据库数据未同步到程序中应该怎么解决呢?

在一些技术不是很强的选手手中&#xff0c;设计数据库时&#xff0c;难免会未考虑到某些字段&#xff0c;只能到后期实现功能时&#xff0c;才能觉察出来数据库中或是少写字段&#xff0c;或是多加了无用的字段&#xff0c;故我们还不得不去数据库中做些手脚。 本文列举的是在…

[.NET跨平台]Jexus独立版本的便利与过程中的一些坑

本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之MonoCentOSJexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看,但是..已经过时了.. 虽然已经出了.NET Core2.0 但是目前是预览版本,而且部署来说 相对比较麻烦. 今…

《四世同堂》金句摘抄(二)

System.out.println("今天读的是什么书呢&#xff1f;"); String bname "《四世同堂》"; System.out.println("今天读的书是&#xff1a;"bname);Console.WriteLine("今天读的是什么书呢&#xff1f;"); String bname "《四世同…

码农不重视文档:开源项目深受其苦

GitHub 刚刚发布了《2017 开源调查》报告&#xff0c;这家知名编程社交网站走访了 github.com 社区内 3800 多个项目和超过 5500 名成员&#xff0c;并且与 500 名在 GitHub 项目生态系统之外的编程者们进行了交谈。本次调查涉及多方面&#xff0c;比如人们在为开源项目做开发、…

[翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比

平均值 vs 百分比 在考虑要性能测试的目标值时&#xff0c;我们需要考虑用什么统计口径。大多数人都会首选平均值&#xff0c;但在大多数情况下&#xff0c;这个正确的&#xff0c;但你也应该适当的考虑百分数。但你有可用性的要求&#xff0c;作为性能测试的目标里肯定会有用…

面对枯燥的源码,如何才能看得下去

转载自 面对枯燥的源码&#xff0c;如何才能看得下去 一个软件开发人员&#xff0c;工作到了一定的年限&#xff08;一般是3、4年左右&#xff09;&#xff0c;如果他还没学会阅读源码&#xff0c;那么他就会遇到瓶颈。因为到了这个时候的开发&#xff0c;他应该不仅仅只会做…

前端防xss攻击(去掉空格等能影响和攻击数据库的字段)

用法&#xff1a;把要传给后端的数据放到此能过滤的函数里面即可就能实现自动过滤的功能 eg 代码 export function XSSFilter(str: string) {// 过滤emoji表情str str.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, );// 过滤所有html标签str str.replace(/&l…

[深圳/广州]微软SQL技术沙龙分享会(MVP)

[深圳/广州] 新一期俱乐部活动报名开始&#xff0c;这次是广深地区SQL Server 技术沙龙分享会&#xff08;MVP)&#xff0c;SQL Server作为一个数据平台&#xff0c;不管是SQL Server 2017 on Linux 还是把一门开源R语言融入其最赚钱的旗舰商业数据库&#xff0c;微软已经决定&…

IntelliJ IDEA 2018.2 发布,支持 Java 11

转载自 IntelliJ IDEA 2018.2 发布&#xff0c;支持 Java 11 近期&#xff0c;JetBrains发布了其旗舰产品IntelliJ IDEA的2018.2版本。新版本支持即将推出的Java 11、断点意图&#xff08;Breakpoints Intentions&#xff09;、MacBook的Touch Bar等特性&#xff0c;并改进了…

发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner

应用场景 多线程在需要批量处理一些任务的时候相当有用&#xff0c;也更加有利于充分利用现有计算机的能力。所有主流的开发语言都支持多线程。 默认情况下&#xff0c;PowerShell作为一个脚本语言&#xff0c;是不支持多线程操作的&#xff0c;虽然有所谓的后台任务&#xf…

java中,在一个有序数组中插入元素,使得数组保持有序排列

//已知有一个数组&#xff0c;/*数组里面的元素有a b c d e f y z,从控制台中随机输入一个字母&#xff0c;按照升序的顺序插入到该数组中并且遍历输出。*/public static void test1(){String [] str{"a","b","c","d","e",&…

[翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio

Visual Studio vs虽然不是全宇宙唯一的IDE&#xff0c;但它是.net开发人员最常用的开发工具。它自带一个性能分析工具&#xff0c;你可以使用它来做开发&#xff0c;不同的vs版本在工具上会略有差别。 VS可以分析CPU使用率&#xff0c;内存分配以及资源锁情况。它能在你开发与…

Java 程序员必备的 Intellij IDEA 插件

转载自 Java 程序员必备的 Intellij IDEA 插件 来源&#xff1a;柠檬学园 以下是我用过不错的Intellij插件&#xff0c;分享给大家希望能帮到大家。 1. .ignore 地址&#xff1a;https://plugins.jetbrains.com/plugin/7495--ignore 生成各种ignore文件&#xff0c;一键创建g…

表单中去掉重置和提交按钮和搜索框

去掉重置和提交按钮 <ProFormsubmitter{{// 配置按钮文本searchConfig: {resetText: 重置,submitText: 提交,},// 配置按钮的属性resetButtonProps: {style: {// 隐藏重置按钮display: none,},},submitButtonProps: {},// 完全自定义整个区域render: (props, doms) > {c…