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

时间:2017-11-19 14:28:13

标签: android api android-emulator identityserver4 asp.net-core-2.0

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

“Bearer”未经过身份验证。失败消息:“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和Identity Server,以便我可以测试客户端。我真的很喜欢它,如果有办法在我的本地机器上运行整个解决方案,而不是为我想要尝试的每件小事进行部署。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

首先:鉴于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。你可以尝试一下,避免做其他类型的解决方法。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

简短答案:在IIS中,请勿将站点绑定主机名设置为空白。

更长的时间:

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

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException: IDX10205:发行者验证失败。发行者:“ http:// ec2XXXXXom”。做过 不匹配:validationParameters.ValidIssuer:“ http://34.111.111.29”或 validationParameters.ValidIssuers:“空”。在 Microsoft.IdentityModel.Tokens.Validators.ValidateIssuer(String 发行者,SecurityToken securityToken,TokenValidationParameters validateParameters)

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

IIS settings