一、前言
用了半年多的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开源社区贡献一份力量