【问题标题】:IdentityServer 4- ASP.net webapi (non core) - Missing ApiResourceIdentityServer 4- ASP.net webapi(非核心)-缺少 ApiResource
【发布时间】:2018-01-25 01:30:12
【问题描述】:

给定

我有一个身份服务器 v4 正在运行。 Javascript 客户端创建令牌并使用生成的 accesstoken 访问 asp.core api。

在 Asp Core Api 中,我有这段代码可以工作

             services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = authority;
                options.ApiName = "myApi";
            });

在 IdentityServer 中,我将“myApi”定义为 ApiResource

问题

现在我想包含另一个 api,它是较旧的 webapi,用 .net4.6.1 编写。但是对这个 api 的所有调用都以 401

结尾

对具有相同令牌的核心 api 使用相同的请求。

代码如下:

      JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
      var options = new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = identServer,
            RequiredScopes = new List<string>
            {
                "myApi"
            }
        };

        app.UseIdentityServerBearerTokenAuthentication(options);

但是,在核心项目中运行的令牌在那里不起作用。 我可以看到的一件事是我无法在 IdentityServerBearerTokenAuthenticationOptions 中设置 api 名称。

目前我正在使用 IdentityServer3.AccessTokenValidation Nuget 包。也许这与问题有关?

由于存在一些依赖问题,我无法使用 IdentityServer4.AccessTokenValidation。 例如,netcore 身份验证构建器只有 AddOptions

通过 jwt.io,我还检查了令牌,可以看到 myApi 是 audscope 的一部分

我也尝试设置不需要的范围,但我得到了 401

前段时间我用身份服务器 v3 测试了它,它在那里工作。

我在日志中也看不到任何验证错误。为了记录 api 令牌验证的错误,我缺少什么?

我错过了什么?

更新 将验证模式设置为端点时,我在身份服务器中遇到了异常。

失败:IdentityServer4.Validation.ApiSecretValidator[0] 未找到具有该名称的 API 资源。中止失败:IdentityServer4.Endpoints.IntrospectionEndpoint[0] API 未经授权调用自省端点。中止。

不幸的是,它并没有告诉我他所期望的 api 是什么...... 如前所述,“myApi”被定义为ApiResource,但是如何在非核心环境中设置api名称?

【问题讨论】:

  • “但在核心项目中运行的令牌在那里不起作用。”那么你得到了什么?
  • 抱歉忘记写了。我得到一个 401

标签: asp.net asp.net-web-api identityserver4 identityserver3


【解决方案1】:

在针对 IDS4 进行身份验证时使用 IdentityServer3.AccessTokenValidation 是可以的,不用担心。

试试这个:

在您的 .net4.6.1 应用程序的Startup.cs 中,在您的IdentityServerBearerTokenAuthenticationOptions 中有一个属性ValidationMode。将其设置为ValidationMode.Both,然后重试。

【讨论】:

  • 检查结果相同,以 401 结尾
  • 您是否在身份服务器上启用了日志记录?如果是,请检查日志中的内容。如果没有 - 启用它并重试,看看日志会说什么。
  • 是的。请从现在开始查看我的更新。将验证设置为端点后,出现错误。似乎它需要一个 api 资源,但我看不出他期望的是哪一个
  • 我现在想到了两件事。首先检查您的.well-known/openid-configuration,并确保您请求的范围在scopes_supported 部分中。然后 - 确保在配置 IdentityServer 时将此范围添加到客户端允许的范围(这两个步骤都在 IdentityServer 端)。我不确定这是否是一个问题,但是 - 你为什么不尝试使用 2 个不同的 2 个 api 范围来使其工作,然后你可以用一个相同的范围再试一次。我有完全相同的配置,但有 2 个作用域并且它可以工作(不保证这是一个问题)。
  • 情况并非如此。最后,如果发现它会在这里发布作为答案,也许它会节省别人的时间
【解决方案2】:

原因是当我使用非核心api进行身份验证时,api资源需要有一个秘密,那么api资源名称和秘密必须在api中设置。

这里:

在身份服务器中

new ApiResource("myApi", "My Test API")
{   
  ApiSecrets = new List<Secret>()
  {
    new Secret("435tgsdgfdg".Sha256()) // This wasnt required when attaching a .net core api
  }
}

然后netfx webapi中的配置是:

var options = new IdentityServerBearerTokenAuthenticationOptions
  {
    ClientId = "myApi",
    ClientSecret = "435tgsdgfdg",
    RequiredScopes = new List<string> { "myApi"},            
    Authority = identtityServerUri,
    DelayLoadMetadata = true
  };

对于asp核心webapi,我既不需要在identityserver中设置秘密,也不需要在客户端中设置clientid和客户端秘密。

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多