博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(一)
阅读量:5162 次
发布时间:2019-06-13

本文共 8773 字,大约阅读时间需要 29 分钟。

IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯


 

前言

 

.net core 2.1已经正式发布了,signalr core1.0随之发布,是时候写个demo了,这里带大家复习了下知识链,构建一个web即时聊天室,整个应用构建思路如下: 

1.使用IdentityServer4作为独立的用户中心与认证中心,采用password授权模式给客户端提供token, 
2.使用RabbitMQ作为消息处理器,客户端发送消息到服务端,服务器并不直接响应该消息,而是发送到消息队列,再由消息处理器获取消息并发送到客户端,提高服务端的处理能力, 
3.数据库使用postgresql,本来准备使用mysql的,不过截止发稿时,EF Core2.1发布后,mysql的使用Code First存在bug还未解决, 
4.使用Docker构建RabbitMQ,postgresql应用,

5. 前后端分离。

地址:


Docker构建基础应用RabbitMQ,postgresql 

环境:虚拟机centos 7.0,docker 
xshell连接到centos。 
1,启动RabbitMQ容器,,设置默认用户admin,密码123123,具体环境变量这些的设置可以参考官方文档: 
docker run -d --hostname myrabbit --name myrabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=123123 -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 --restart=always rabbitmq:management
2.启动postgresql,,设置默认用户gucao,密码123123,这里启动时设置的用户是属于超级管理员,挂载数据卷~/docker/postgresql/pgdata目录作为数据存储目录,--privileged设置容器拥有root权限进行文件读写: 
docker run --restart=always --privileged --name mypostgresql -e POSTGRES_PASSWORD=123123 -e POSTGRES_USER=gucao -v ~/docker/postgresql/pgdata:/var/lib/postgresql/data/ -d -p 5432:5432 postgres
成功启动后: 

 

端口号都映射为默认端口。psotgresql默认端口号5432,RabbitMQ用的到端口号比较多,15672是ui管理的端口号。我的虚拟机IP是192.168.1.107。浏览器打开地址:192.168.1.107:15672:

能看到这个登录页面就说明一切ok了。输入容器启动时设置的用户名密码。登录后可以查看当前的一些队列信息。

使用Navicat连接数据库,也没有问题:

就这么简单的2个命令就启动了2个应用,如果自己下载安装包来安装,那真是够折腾人的,还得考虑各种各样的环境,不得不说docker真是一个伟大的工具。

 


  IdentityServer4 用户中心

 

 关于IdentityServer4的具体各种使用这里不会赘述,大家可以多参考以下资料: 

 

我们这里集成AspNetCore Identity提供用户管理,客户端(client),资源(ApiResource,IdentityResource)等配置资料都使用数据库存储。

需要用到的库:

1.IdentityServer4;

2.IdentityServer4.AspNetIdentity ,IdentityServer4集成AspNetCore Identity用到的库;

3.IdentityServer4.EntityFramework,IdentityServer4使用EF作为数据存储用到的库;

4.Npgsql.EntityFrameworkCore.PostgreSQL,postgresql ef驱动库;

5.Microsoft.EntityFrameworkCore.Tools,Ef Code First工具库。

好吧,啰嗦一点,

1.创建空的.net core web项目 Demo.Identity,nuget安装以上用到的库;

2.创建appsettings.json配置文件,增加数据库连接配置,文件名不能错,ConnectionStrings不能错,这是默认的约定

{  "ConnectionStrings": {    "chat": "server=192.168.1.107;user id=gucao;password=123123;persistsecurityinfo=True;database=signalrdemo;"  }}

3.增加Data文件夹,存放用户实体,DbContext,种子数据文件类,这里我们使用guid作为主键,这里主要是AspNetCore Identity的类

DemoUser继承自IdentityUser<Guid>,增加一个头像属性

public class DemoUser : IdentityUser
{ public string Avatar { get; set; } }

因为默认是string类型的主键,要更改主键类型,需要同时建一个Role类,也设置为guid主键,DemoRole:

public class DemoRole : IdentityRole
{ }

DemoDbContext

public class DemoDbContext : IdentityDbContext
{ public DemoDbContext(DbContextOptions
options) : base(options) { } }

SeedData就用来提供基本的数据了,这里先设置3个用户,要聊天总不能一个人聊得开心是吧

public static List
Users() { return new List
{ new DemoUser { UserName = "laowang", Email = "520@qq.com", Id = Guid.NewGuid(), EmailConfirmed = true, TwoFactorEnabled = false, Avatar = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1528131041794&di=78ae71a3573dc86bc010e301005fea53&imgtype=0&src=http%3A%2F%2Fpic2.orsoon.com%2F2017%2F0309%2F20170309032925886.png" }, new DemoUser { UserName = "zhangsan", Email = "521@qq.com", Id = Guid.NewGuid(), EmailConfirmed = true, TwoFactorEnabled = false, Avatar = "http://pic20.photophoto.cn/20110804/0010023712739303_b.jpg" }, new DemoUser { UserName = "lisi", Email = "521@qq.com", Id = Guid.NewGuid(), EmailConfirmed = true, TwoFactorEnabled = false, Avatar = "http://p1.qzone.la/upload/0/14vy5x96.jpg" } }; }

4.好了 下面开始配置StartUp中的服务,这里我就直接贴代码了

public void ConfigureServices(IServiceCollection services)        {            // 配置AspNetCore Identity 的DbContext服务            services.AddDbContext
(r => { r.UseNpgsql(configuration.GetConnectionString("chat"), options => { // 配置迁移时程序集 options.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); }); }); // 配置AspNetCore Identity服务用户密码的验证规则 services.AddIdentity
(options => { options.Password.RequireDigit = false; options.Password.RequiredLength = 6; options.Password.RequireLowercase = false; options.Password.RequireUppercase = false; options.Password.RequireNonAlphanumeric = false; }) // 告诉AspNetCore Identity 使用DemoDbContext为数据库上下文 .AddEntityFrameworkStores
() .AddDefaultTokenProviders(); // 配置ids4服务 services.AddIdentityServer() .AddDeveloperSigningCredential() // ids4使用AspNetCore Identity为用户认证 .AddAspNetIdentity
() // 使用数据库来存储客户端Clients ApiResource IdentityResource .AddConfigurationStore(options => { options.ConfigureDbContext = builder => { builder.UseNpgsql(configuration.GetConnectionString("chat"), sql => { sql.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); }); }; }) // 使用数据库存储授权操作相关操作,数据库表PersistedGrants .AddOperationalStore(options => { options.ConfigureDbContext = builder => { builder.UseNpgsql(configuration.GetConnectionString("chat"), sql => { sql.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name); }); }; }) // ids4使用自定义的用户档案服务 .Services.AddTransient
(); // 配置跨域,允许所有 services.AddCors(r => { r.AddPolicy("all", policy => { policy .AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials() ; }); }); }
View Code

 这里有一句Services.AddTransient<IProfileService, ProfileService>(),什么意思呢?我希望在前端通过请求token时,token中自带有用户基本信息:用户名,头像等等,通过这个类配置ids4发布token时带上这些用户信息;

public class ProfileService : IProfileService    {        UserManager
userManager; // 注入AspNetCore Identity的用户管理类 public ProfileService(UserManager
userManager) { this.userManager = userManager; } public async Task GetProfileDataAsync(ProfileDataRequestContext context) { var claims = context.Subject.Claims.ToList(); // sub属性就是用户id var userId = claims.First(r => r.Type == "sub"); // 查找用户 var user = await userManager.FindByIdAsync(userId.Value); claims.Add(new System.Security.Claims.Claim("username", user.UserName)); claims.Add(new System.Security.Claims.Claim("email", user.Email)); claims.Add(new System.Security.Claims.Claim("avatar", user.Avatar)); // 这里是设置token包含的用户属性claim context.IssuedClaims = claims; } public async Task IsActiveAsync(IsActiveContext context) { context.IsActive = true; await Task.CompletedTask; } }
View Code

Configure

public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            app.UseCors("all");            app.UseIdentityServer();        }
View Code

5.可以开始生成迁移代码了,这里有3个DbContext类需要生成迁移:DemoDbContext,ConfiguraionDbContext(ids4 配置数据上下文),PersistedGrantDbContext(ids4授权操作数据上下文)

Add-Migration init -Context DemoDbContext -OutputDir Migrations/IdentityDbMigrations

Add-Migration init -Context ConfigurationDbContext -OutputDir Migrations/ConfigurationDbMigrations

Add-Migration init -Context PersistedGrantDbContext -OutputDir Migrations/PersistedGrantDbMigrations

 

好了,篇幅有点长了,先到这。

转载于:https://www.cnblogs.com/gucaocao/p/9162187.html

你可能感兴趣的文章
hadoop2.2.0+hive-0.10.0完全分布式安装方法
查看>>
django知识点总结
查看>>
C++ STL stack、queue和vector的使用
查看>>
使用Reporting Services时遇到的小问题
查看>>
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
如何将应用完美迁移至Android P版本
查看>>
【转】清空mysql一个库中的所有表的数据
查看>>
基于wxPython的python代码统计工具
查看>>
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>