【问题标题】:Identity Server 3 Access Token Validation Library Cannot Validates Tokens Generated from Identity Server 4Identity Server 3 访问令牌验证库无法验证从 Identity Server 4 生成的令牌
【发布时间】:2020-03-13 13:42:29
【问题描述】:

我有一个在身份服务器 4 (v3.1.2) 上开发的身份服务器和一个在 .NET Framework 4.6 上开发的 .NET Web API。在 Web API 中,我使用 Identity Server 3 访问令牌验证库 (v2.14.0) 来验证传入请求的令牌。

当我尝试使用由身份服务器生成的 JWT 令牌访问 .NET Web API 上的资源时,我总是收到未经授权的 401 响应。我在 .NET Web API 中设置了 Owin 中间件,如下所示。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "http://localhost:9080/IdentityServer"
        });

        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        app.UseWebApi(config);
    }
}

但是,为了确定这是否是身份服务器 4 令牌和身份服务器 3 访问令牌验证库之间的问题,我使用身份服务器 3 库 (v2.6.3) 创建了一个单独的身份服务器并提供了一个令牌从它生成到我之前使用的相同 Web API(与上面相同的 Startup.cs)。

此请求已成功授权,一切正常。

我的问题是:

是否可以使用来自身份服务器 4 的令牌来使用身份服务器 3 访问令牌验证库进行验证?还是我做错了什么?

【问题讨论】:

  • 您是否收到任何错误消息?你也可以在 IDS4 服务器端 trace log
  • 不,我没有收到任何错误。我也启用了身份服务器日志。但是一旦请求到达 web api,就没有任何反应。我注意到的一件事是,一旦我启动 web api(仅在启动时),登录 ID 服务器就会打印出提及发现端点和 jwks uri 的信息。除此之外什么都没有。
  • 抱歉,尝试在 web api 端而不是 IDS 端跟踪日志。或者您可以使用 fiddler 来跟踪请求/响应,并检查任何内部错误消息是否包含 401 错误。
  • 我在 Web API 中启用了 Owin 上下文的跟踪日志。发现有一个异常是由于受众不匹配而导致的。显然,身份服务器 3 访问令牌验证库将我的令牌的受众与它基于库中的颁发者创建的受众 (/resources) 进行对比。从我的 IDS 4 生成的令牌具有与此不同的受众(/resources)。是否有可能让我自己设置观众而不是让图书馆设置?
  • 这可能是令牌标头更改的问题(显式类型 + 已删除 /resources 受众)。看看this question + answer了解更多信息。

标签: c# .net asp.net-core identityserver4 identityserver3


【解决方案1】:

我不确定,但我认为您的授权 URL 不正确。我有一个与你类似的场景,我使用 IdentityServer3.AccessTokenValidation NuGet 包解决了它,它工作得很好。所以我确定您的问题与中间件无关。

尝试替换 startup.cs 文件中的以下代码,一切都会正常。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {

        IdentityServerBearerTokenAuthenticationOptions options = new IdentityServerBearerTokenAuthenticationOptions
            {
                Authority = "http://localhost:9080",
                AuthenticationType = "Bearer"
            };

        app.UseIdentityServerBearerTokenAuthentication(options);

        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        app.UseWebApi(config);
    }
}

希望这能解决您的问题!

【讨论】:

  • 谢谢。我能够使用 owin 日志发现由于受众验证而发生了未经授权的请求。我在上面的评论中提到了当前的问题。你对此有何看法?
  • 如果日志显示无效的受众,那么您能否在 Client 和 WebApi 项目中验证您的 ID4 URL?请记住,此 URL 区分大小写。您可以从 jwt.io 解码您的 JWT 令牌。
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 2018-03-08
  • 2020-02-06
  • 1970-01-01
  • 2018-06-01
  • 2018-09-14
  • 1970-01-01
  • 2018-07-19
相关资源
最近更新 更多