一、前言


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

  今天给大家讲讲如何在利用abp vnext框架搭建IDS4且可以在生产环境下使用的,其中也需要针对于IDS4在liunx系统使用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包

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

 打开 Ids4DemoEntityFrameworkCoreModule 修改模块注入和命名空间

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

 2、Louie.Ids4Demo.EntityFrameworkCore.DbMigrations 类库,删除Migrations文件

并且修改Ids4DemoMigrationsDbContextFactory.cs文件中的链接配置

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

 3、在Louie.Ids4Demo.IdentityServer 主程序中 appsetting.json 添加数据库连接字符串

4、然后使用迁移命令,生成对应的数据库表

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

 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,如果可以查看到端点则代表配置成功。

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

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开源社区贡献一份力量

如果在开发过程中遇到问题,欢迎留言。

asp.net core 交流群:787464275 欢迎加群交流
如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

作者:LouieGuo
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

微信公众号:欢迎关注                                                 QQ技术交流群: 欢迎加群

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

09-02 20:54