处理时间:2020年8月13日
ABP版本: ABP vNext 3.0.5 (当时最新版本)
Docker+Linux
先说说情况
- ABP 创建的程序, 使用Docker在Linux上进行部署;
- 客户端使用前台端分离,所有验证需要使用Token;
- 使用域名+证书来保障安全性;
以上是开发和部署要求,其他的一切正常,使用用户名和密码能获取Token。但是,后来就出现大问题了...

问题来了!!!
通过Token调用其他API时,出现返回JSON中提示:
Authorization failed! Given policy has not granted.
开始以为是appsettings.json 中的 Authority 配置问题,一直试图修改对应的配置,但没任何改变。
但也有执行正常的情况:
- 本地调试没有问题。
- 使用IP地址:端口,来调用没有问题。
- 使用Web(swagger)没有问题。
问题显然跟配置了域名有很大关系,但按之前其他程序部署的经验,没有任何错误之处,所以一度进入死胡同。虽然使用IP地址也可以给前端使用,但显示不能满足需要,后来在不断测试和分析,也经不起求(zuo)知(si)欲望,总算有了眉目。

看到以上的日志,总算是有点方向了。哎。。。不容易啊。这里先等等,其实一开始要看到这些提示都不可能,我是在别一段日志中看到线索。

在这段中看到一个IO错误提示,开始还不以为然,后来抱着试一试的想法,对程序作了修改。
IdentityModelEventSource.ShowPII = true;
这段代码需要加在 Startup 的 Configure 中(普通net程序)
Abp是加在 OnApplicationInitialization
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
。。。
IdentityModelEventSource.ShowPII = true;
。。。
}这样就能看到隐藏的日志了,这个配置不是解决问题的必要条件。
好了,这样就能看到上面说到的404问题了。
根据以上日志提示,我在浏览器中打入https://{域名}/.well-known/openid-configuration,发现还真的是404,马上使用IP地址(https:/{ip:port}/.well-known/openid-configuration)发现有内容!!总算找到不同了!
这时候又看到了熟悉的单词(.well-known),这货是用来SSL证书验证目录的,配置在Nginx,这就对了,跟域名和证书占上边。马上修改Nginx的配置,注解了Nginx中对应域名的.well-known,回过来使用域名访问API,OK ,再也不是烦人的Authorization failed! Given policy has not granted. 使用其他API都一切正常了。
后记:
ABP 是个好东西,但用的人还是少,坑太多了,记下来作个留念。