代码之家  ›  专栏  ›  技术社区  ›  Bug

同一项目中的IdentityServer4令牌颁发者和使用者

  •  5
  • Bug  · 技术社区  · 6 年前

    我有一个托管IdentityServer4的项目,我正试图在同一个项目中托管一个Web API,它接受访问令牌。

    我的问题是,单个项目是否可能包含使用相同IdentityServer的IdentityServer和Web API?

    编辑 :必须使用Authorize属性保护API

    2 回复  |  直到 6 年前
        1
  •  7
  •   Linda Lawton - DaImTo    6 年前

    我有一个identity server 4项目,在同一个项目中,有一个用于客户端CIUD的API。(让我们称之为开发人员控制台api)。

    然后我有一个附带项目是asp。net核心项目,该项目包含开发人员控制台的实际razor页面,它访问Identity server项目中的API。

    我这样做的原因是,只有一个项目应该更新数据库。因此,为了更新identity server拥有的数据库,决定访问该数据库的API也应位于同一项目中。

    是的,您可以在Identity server 4项目中使用web api。

    配置服务

    services.AddAuthentication(IdentityServerConstants.DefaultCookieAuthenticationScheme)
                    .AddIdentityServerAuthentication(options =>
                    {
                        // base-address of your identityserver
                        options.Authority = settingsSetup.Settings.Authority;
                        // name of the API resource
                        options.ApiName = "testapi";
                        options.RequireHttpsMetadata = false;
                    });
    

    配置

    我认为这两者都需要。

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    app.UseAuthentication();
    app.UseIdentityServer();
    

    端点

    由于请求是使用访问令牌作为承载令牌发送的,因此每个API调用的授权都需要包括authencationScheme。我还没有弄清楚原因,但如果没有这个,它就行不通了。

    [HttpGet("Client/List")]
    [Authorize(AuthenticationSchemes = "Bearer")]
    public ActionResult ClientList()
      {
    
      }
    
        2
  •  4
  •   Kahbazi    6 年前

    虽然@DaImTo的答案正确且有效,而且它是由IdentityServer团队开发的,但它使用 Introspection Endpoint 这意味着对于每个请求 AddIdentityServerAuthentication 将创建http请求并将其发送到您的服务器,该服务器与应用程序相同。

    我开发了一个名为 IdentityServer4。承包商。LocalAccessTokenValidation 做完全相同的事情但不使用 自省端点 。它将直接从 TokenStore 在服务中配置。如果你感兴趣的话,可以使用它。

    nuget链接: https://www.nuget.org/packages/IdentityServer4.Contrib.LocalAccessTokenValidation

    github链接: https://github.com/Kahbazi/IdentityServer4.Contrib.LocalAccessTokenValidation