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

Unable to validate issuer when trying to access API

所以这是对我的问题的快速解释 - 我当前的设置是和 IdentityServer4 实施与 ASP.NET 核心身份,一个受它保护的 API 资源和一个 Xamarin.Android 应用程序客户端。我当前的问题是客户端 (Android) 无法从 API 中获取任何内容,因为出现以下错误(来自 API 日志):

"Bearer" 未通过身份验证。失败信息:"IDX10205: Issuer validation failed. Issuer: 'http://10.0.2.2:5000'. Did not match: validationParameters.ValidIssuer: 'null' or validationParameters.ValidIssuers: 'http://127.0.0.1:5000'."

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

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

非常感谢任何帮助。

第一:鉴于standard,您只管理一个发行人。

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

您可以自定义 API 以明确创建您的令牌。然后,您可以指定一个全局 Issuer(例如您的项目 url),这样任何人都可以对其进行验证。

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

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

Creating RESTful API with Authentication

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

因此,我设法解决了这个问题,方法是 运行 将它的 Web 部分设置为在我的本地网络上可见。我更详细地做了什么 - 在我创建主机的 Program.cs 中,我使用 .UseUrls("http://*:5001") 方法,然后我 运行 使用 dotnet run 的应用程序。

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

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

更长的解释:

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

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException: IDX10205: Issuer validation failed. Issuer: 'http://ec2XXXXXom'. Did not match: validationParameters.ValidIssuer: 'http://34.111.111.29' or validationParameters.ValidIssuers: 'null'. at Microsoft.IdentityModel.Tokens.Validators.ValidateIssuer(String issuer, SecurityToken securityToken, TokenValidationParameters validationParameters)

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