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. 前后端分离。

https://github.com/280780363/signalrdemo.git


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 用户中心

 

晓晨的博客

我们这里集成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的类

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

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

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

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

    public class DemoRole : IdentityRole<Guid>
    {
    }

DemoDbContext

    public class DemoDbContext : IdentityDbContext<DemoUser, DemoRole, Guid>
    {
        public DemoDbContext(DbContextOptions<DemoDbContext> options) : base(options)
        {
        }
    }

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

        public static List<DemoUser> Users()
        {
            return new List<DemoUser>{
                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<DemoDbContext>(r =>
            {
                r.UseNpgsql(configuration.GetConnectionString("chat"), options =>
                {
                    // 配置迁移时程序集
                    options.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);
                });
            });

            // 配置AspNetCore Identity服务用户密码的验证规则
            services.AddIdentity<DemoUser, DemoRole>(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<DemoDbContext>()
            .AddDefaultTokenProviders();

            // 配置ids4服务
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                // ids4使用AspNetCore Identity为用户认证
                .AddAspNetIdentity<DemoUser>()
                // 使用数据库来存储客户端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<IProfileService, ProfileService>();

            // 配置跨域,允许所有
            services.AddCors(r =>
            {
                r.AddPolicy("all", policy =>
                {
                    policy
                    .AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials()
                    ;
                });
            });
        }
View Code

相关文章:

  • 2021-08-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-28
  • 2022-12-23
  • 2022-12-23
  • 2021-04-12
猜你喜欢
  • 2021-07-12
  • 2021-11-01
  • 2021-12-17
  • 2021-11-07
  • 2021-09-13
相关资源
相似解决方案