尝试访问 API 时无法验证颁发者

Posted

技术标签:

【中文标题】尝试访问 API 时无法验证颁发者【英文标题】:Unable to validate issuer when trying to access API 【发布时间】:2018-05-02 20:13:14 【问题描述】:

所以这里是对我的问题的快速解释 - 我当前的设置是使用 ASP.NET Core Identity、受它保护的 API 资源和作为客户端的 Xamarin.android 应用程序的 IdentityServer4 实现。我当前的问题是由于以下错误(来自 API 日志),客户端(Android)无法从 API 获取任何内容:

“承载者”未通过身份验证。失败消息:“IDX10205:颁发者验证失败。颁发者:'http://10.0.2.2:5000'。不匹配:validationParameters.ValidIssuer:'null' 或 validationParameters.ValidIssuers:'http://127.0.0.1:5000'。”

基本上,由于我使用的是 Android 模拟器,为了调用我机器上 localhost 上的内容,我需要使用 10.0.2.2 URL。然后问题就出现了——身份服务器可以通过身份验证,我可以正常登录,我得到了一个访问令牌,但之后我需要调用 API。这就是错误发生的地方 - 它期望一个具有相同权限(127.0.0.1:5000)但收到 10.0.2.2:5000 的颁发者,这是 Android 客户端的权限。

所以,我的问题是 - 有没有办法以某种方式指定 10.0.2.2 也是一个有效的颁发者,或者我是否必须开始考虑部署 API 和身份服务器,以便我可以测试客户端。如果有一种方法可以让整个解决方案在我的本地机器上运行,而不必为我想尝试的每一件小事进行部署,我真的很高兴。

非常感谢任何帮助。

【问题讨论】:

嗨!你有什么解决办法吗? 不,还没有真正有时间研究它 - 到目前为止,我的想法主要是尝试将应用程序部署到本地 IIS 并在防火墙中打开它,或者弄清楚如果我可以告诉应用程序信任任何进入端口 5000 的内容。我可能会在一些休息日尝试修复此问题,因为这是针对个人项目,而不是与工作相关的项目。 好的,谢谢您的回复。是的,我想最简单的方法是将应用程序部署在本地开发服务器上并访问这些 URL。这就是我现在正在做的事情,而且效果很好! 【参考方案1】:

简答:在 IIS 中,不要将站点绑定主机名设置为空白。

更长的解释:

我收到了类似的错误,但可以看到由于某种原因它试图匹配颁发者域名与 IP(域确实指向 IP,但我猜它试图验证这两个字符串)。允许登录后我可以看到这个错误:IdentityModelEventSource.ShowPII = true.

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException: IDX10205:颁发者验证失败。发行人:“http://ec2XXXXom”。做过 不匹配:validationParameters.ValidIssuer:'http://34.111.111.29' 或 验证参数.ValidIssuers:'null'。在 Microsoft.IdentityModel.Tokens.Validators.ValidateIssuer(字符串 发行者,SecurityToken securityToken,TokenValidationParameters 验证参数)

在 IIS 中,我之前将主机名设置为空白(我使用服务器名称作为域名) - 因此它使用服务器的 IP 设置发行者。当我专门设置站点域名时,它起作用了。

【讨论】:

【参考方案2】:

所以,我设法通过简单地运行它的 Web 部分来解决这个问题,以便它在我的本地网络上可见。我所做的更详细 - 在我创建主机的 Program.cs 中,我使用 .UseUrls("http://*:5001") 方法,然后使用 dotnet run 运行应用程序。

通过这种方式,您的应用可以通过您机器的 IP 地址和您指定的端口在您的本地网络中访问。此外,为了使其正常工作,您必须在防火墙中定义一个新的出站规则,以允许流量通过您正在使用的端口。希望这对其他人也有帮助,事实证明这是获得我需要工作的最简单的方法,这是在与 IIS 斗争了一段时间之后试图让它在那里工作。

【讨论】:

【参考方案3】:

第一:给定standard,您只管理一个发行者。

您是否在管理自己的身份/令牌生成?听起来情况并非如此。

您可以自定义 API 以显式创建令牌。然后,您可以指定一个全局颁发者(例如您的项目 url),以便任何人都可以验证。

var token = new JwtSecurityToken(
                issuer: "http://my-perfect-proj.net",
                claims: ...,
                notBefore: DateTime.Now,
                expires: DateTime.Now.AddHours(1),
                signingCredentials: ...)
            );

创建并发送您的令牌后,根据您的喜好(检查时间、用户数据、颁发者)验证您的传入请求。

ASP.NET Core JWT Bearer Token Custom Validation

Creating RESTful API with Authentication

编辑:在同一台机器上使用 Xamarin 和 Visual Studio,并没有给我这种问题,但在这种情况下,我使用的是 Visual Studio Emulator。您可以尝试一下,避免使用其他类型的解决方法。

【讨论】:

可能是一个解决方案,但我宁愿不必为了能够在本地运行它而做所有这些 - 我宁愿不更改代码库而是找到一种方法在我的内部网络上公开 API。是的,与我现在使用的 Google 模拟器相比,VS 模拟器的工作方式有所不同,但这对我的一些需求来说是一种痛苦,所以我停止使用它。不过感谢您的意见 - 其他人可能会从中受益。

以上是关于尝试访问 API 时无法验证颁发者的主要内容,如果未能解决你的问题,请参考以下文章

验证多租户 .Net Core Web API 应用程序的颁发者的适当位置

证书验证失败:无法获取本地颁发者证书

OpenSSL 验证:不同 OpenSSL 版本之间的“0 深度查找时的错误 20:无法获取本地颁发者证书”

“验证返回码:21(无法验证第一个证书)”

MSIS0037:未找到颁发者的签名验证证书

Azure Identity:自定义令牌验证以验证多租户应用程序中的颁发者