ABP VNext实践之搭建可用于生产的IdentityServer4

一、前言

用了半年多的abp vnext,在开发的效果还是非常的好,可以说节省了很多时间,像事件总线、模块化开发、动态API进行远程调用、自动API控制器等等,一整套的规范,让开发人员更方便的集成,提升效率;大家如果想多了解abp vnext 更多的资料或者源码,可以到github上看,文章结尾也会给出源码地址和wiki地址,优秀的你们要更优秀才行。

今天给大家讲讲如何在利用abp vnext框架搭建IDS4且可以在生产环境下使用的,其中也需要针对于IDS4在linux系统使用nginx代理中端点不是https的特别注意事项配置,这个也是一个坑,如果不注意,授权就不成功,除非配置了跳过https的强制验证;

二、ABP VNext CLI生成一个项目解决方案

CLI 命令大家可以参考wiki,命令如下:abp new Louie.Ids4Demo --ui none --separate-identity-server,其中 --separate-identity-server代表将IdentityServer应用程序与API host应用程序分开,--ui none 无UI;打开命令窗口,拷贝进去后就可以生成一个解决方案;

然后我们授权需要修改一下项目中的代码迁移配置,因为我这边用的是mysql,而命令生成的是使用sqlserver,在 Louie.Ids4Demo.EntityFrameworkCore中把SQLServer改成Mysql nuget包,并且在DbMigrations类库中删除Migrations文件夹,然后修改DbContextFactory.cs里面的配置;截图如下:

1、Louie.Ids4Demo.EntityFrameworkCore 类库,去掉sqlserver包,添加mysql
在这里插入图片描述
打开 Ids4DemoEntityFrameworkCoreModule 修改模块注入和命名空间
在这里插入图片描述
2、Louie.Ids4Demo.EntityFrameworkCore.DbMigrations 类库,删除Migrations文件

并且修改Ids4DemoMigrationsDbContextFactory.cs文件中的链接配置
在这里插入图片描述
3、在Louie.Ids4Demo.IdentityServer 主程序中 appsetting.json 添加数据库连接字符串

4、然后使用迁移命令,生成对应的数据库表
在这里插入图片描述
5、打开Louie.Ids4Demo.IdentityServer 主程序,打开Ids4DemoIdentityServerModule.cs

在里面配置自定义的RSA非对称加密证书,并且禁止在开发环境下由系统生成的临时证书,我们需要使用重写PreConfigureServices来替换框架默认的配置

public override void PreConfigureServices(ServiceConfigurationContext context)
        {
            var configuration = context.Services.GetConfiguration();

            var filePath = Path.Combine(AppContext.BaseDirectory, configuration["Certificates:CerPath"]);
            if (!File.Exists(filePath))
            {
                throw new FileNotFoundException($"没有证书!");
            }
            //禁止生成开发的id4证书
            PreConfigure<AbpIdentityServerBuilderOptions>(options =>
            {
                options.AddDeveloperSigningCredential = false;

            });

            PreConfigure<IIdentityServerBuilder>(opt =>
            {
                opt.AddSigningCredential(new X509Certificate2(
                                filePath,
                                configuration["Certificates:Password"] //Export Password)
                    ))
                .AddResourceOwnerValidator<AuthROPValidator>()  
                .AddProfileService<AuthROPProfileService>();
            });
        }

当然证书是我自己生成的,大家可以自行生成,把生成好的证书放在主程序的目录下,然后再appsetting.json 中配置一下

"Certificates": { //IDS4的签名证书,防止串改
    "CerPath": "xxxx/idsrv4.pfx", //路径地址
    "Password": "xxxx" //访问x509证书的访问密码,在证书生成的时候有要求配置密码
  },

上面配置中有涉及到AddResourceOwnerValidator主要是用到密码模式下的自定义验证逻辑以及添加声明,如果大家不需要则可以不用配置,直接注释;AddProfileService 主要是是声明claims需要和库表中定义的申明一致,否则无法显示,这个也是一个安全校验的方式。

配置完后启动打开浏览器,并且启动的url后缀添加 .well-known/openid-configuration,如果可以查看到端点则代表配置成功。
在这里插入图片描述

6、问题来了,在我们的IDS4部署到docker上后,发现查看的端点不是https的,我们需要在OnApplicationInitialization 方法中配置一个特殊代码

当然大家也可以看一下一个解决方案的issue:https://github.com/dotnet/AspNetCore.Docs/issues/2384

主要阿德原因是使用的反向代理导致域名是https的,但是端点无法映射https;插入以下代码即可

var forwardOptions = new ForwardedHeadersOptions
            {
                ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
                RequireHeaderSymmetry = false
            };

            forwardOptions.KnownNetworks.Clear();
            forwardOptions.KnownProxies.Clear();

            // ref: https://github.com/aspnet/Docs/issues/2384
            app.UseForwardedHeaders(forwardOptions);

大家在部署到生产线后就可以看到端点已经是https

7、ids4配置已经介绍完成了,希望大家可以多为.net core开源社区贡献一份力量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值