IdentityServer4 令牌发行者和消费者在同一个项目中
Posted
技术标签:
【中文标题】IdentityServer4 令牌发行者和消费者在同一个项目中【英文标题】:IdentityServer4 token issuer and consumer in the same project 【发布时间】:2018-09-13 15:01:39 【问题描述】:我有一个托管 IdentityServer4 的项目,并且我正在尝试在同一个项目中托管一个 Web API,它接受访问令牌。
我的问题是,单个项目是否可能包含 IdentityServer 和使用相同 IdentityServer 的 Web API?
编辑:必须使用 Authorize 属性保护 API
【问题讨论】:
【参考方案1】:我有一个身份服务器 4 项目,在同一个项目中有一个用于客户端 CIUD 的 API。 (让我们称之为开发者控制台 api)。
然后我有一个附带项目,它是一个 asp .net 核心项目,其中包含开发者控制台的实际剃须刀页面,它访问身份服务器项目中的 API。
我这样做的原因是只有一个项目应该更新数据库。因此,为了更新身份服务器拥有的数据库,决定访问它的 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()
【讨论】:
感谢您的回复,我应该如何将 IdentityServer 项目配置为既是问题又是消费者? 好问题,我记得这很痛苦。我可以编辑问题并从我的 Startup 中给你一些东西。如果您有任何问题,请告诉我。 哇,我很震惊,我可能不得不记录这个:)【参考方案2】:虽然@DaImTo 的答案是正确且有效的,并且由 IdentityServer 团队开发,但它使用 Introspection Endpoint
,这意味着对于每个请求,AddIdentityServerAuthentication
将创建一个 http 请求并将其发送到您的服务器,这是同一个应用程序。
我开发了一个名为 IdentityServer4.Contrib.LocalAccessTokenValidation 的库,它执行完全相同的操作,但没有使用 Introspection Endpoint
。它将直接从服务中配置的TokenStore
验证令牌。有兴趣可以使用。
nuget 链接:https://www.nuget.org/packages/IdentityServer4.Contrib.LocalAccessTokenValidation
github 链接:https://github.com/Kahbazi/IdentityServer4.Contrib.LocalAccessTokenValidation
【讨论】:
嗨,谢谢,我不知道如何使用它。你能帮我完成初始配置吗?以上是关于IdentityServer4 令牌发行者和消费者在同一个项目中的主要内容,如果未能解决你的问题,请参考以下文章
IdentityServer4 - 刷新令牌混合流程 - Cookie 和存储
如何在 identityserver4 中没有用户名和密码的情况下从令牌端点获取令牌?