使用 OIDC 资源服务器保护 API
Securing API using OIDC Resoource server
我有 2 个 .NET 解决方案:一个 webapp,一个 API。
当用户浏览 webapp 时,他需要进行身份验证,因此面临:
return builder.AddOpenIdConnect("contonso", options =>
{
options.Authority = configuration["Contonso:Oidc:Authority"];
options.ClientId = configuration["Contonso:Oidc:ClientId"];
options.ClientSecret = configuration["Contonso:Oidc:ClientSecret"];
options.ResponseType = OpenIdConnectResponseType.Code;
options.ProtocolValidator.RequireState = true;
options.UsePkce = false;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
}
当我获得所有信息时效果很好:code
、token
、id_token
一旦用户通过身份验证。
- 我将上面的代码复制到我的 API 并更改 clientId/clientSecret 以指向我的资源服务器。
- 在我的网络应用程序中,我调用 API 添加授权:Bearer
token
(之前已收到)。
但是在 API 解决方案中,无论我在授权中传递什么,我每次都会被重定向到登录页面 header。
我是否需要更改 API 代码中的某些内容才能使令牌“传输”到资源服务器并仅验证收到的令牌?
干杯,
APIs 与网络后端的行为不同。 API 不应该重定向客户端,而应该只验证 JWT 访问令牌:
- Return JWT 有效时出现 200 错误
- Return 不是时出现 401 错误
您通过调用 AddJwtBearer
在 API 中使用不同的 .Net 中间件。这是执行此操作的 Curity code example。
主要是实现基于标准的行为,然后可以与任何编程语言和授权服务器一起使用。
API 代码
API JWT 验证有两种主要方法,您使用的是第一种:
- 使用 JWT 框架(例如 ASP.Net Core)
- 使用 JWT 库
当您不熟悉使用 OAuth 保护 APIs 时,了解库方法的代码可能很有用,如 this class of mine 中所示,其中显示了 API 应该使用:
- 从授权服务器下载令牌签名 public 密钥
- 将 public 密钥提供给一个库,然后它将以加密方式验证 JWT
- 同时检查发行人、受众和算法是否符合预期
.Net Core 会自动为您完成此操作,因此请使用 Curity 代码示例方法,因为您将编写更少的代码。
一如既往,RTFM 是个好方法。我需要调用内省端点来验证我的令牌。此处也有解释:https://connect2id.com/products/server/docs/api/token-introspection
然后我使用了一个 Nuget 包来做这件事,它工作正常。
无论如何感谢你的帮助和闪电加里:)
我有 2 个 .NET 解决方案:一个 webapp,一个 API。 当用户浏览 webapp 时,他需要进行身份验证,因此面临:
return builder.AddOpenIdConnect("contonso", options =>
{
options.Authority = configuration["Contonso:Oidc:Authority"];
options.ClientId = configuration["Contonso:Oidc:ClientId"];
options.ClientSecret = configuration["Contonso:Oidc:ClientSecret"];
options.ResponseType = OpenIdConnectResponseType.Code;
options.ProtocolValidator.RequireState = true;
options.UsePkce = false;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
}
当我获得所有信息时效果很好:code
、token
、id_token
一旦用户通过身份验证。
- 我将上面的代码复制到我的 API 并更改 clientId/clientSecret 以指向我的资源服务器。
- 在我的网络应用程序中,我调用 API 添加授权:Bearer
token
(之前已收到)。
但是在 API 解决方案中,无论我在授权中传递什么,我每次都会被重定向到登录页面 header。
我是否需要更改 API 代码中的某些内容才能使令牌“传输”到资源服务器并仅验证收到的令牌?
干杯,
APIs 与网络后端的行为不同。 API 不应该重定向客户端,而应该只验证 JWT 访问令牌:
- Return JWT 有效时出现 200 错误
- Return 不是时出现 401 错误
您通过调用 AddJwtBearer
在 API 中使用不同的 .Net 中间件。这是执行此操作的 Curity code example。
主要是实现基于标准的行为,然后可以与任何编程语言和授权服务器一起使用。
API 代码
API JWT 验证有两种主要方法,您使用的是第一种:
- 使用 JWT 框架(例如 ASP.Net Core)
- 使用 JWT 库
当您不熟悉使用 OAuth 保护 APIs 时,了解库方法的代码可能很有用,如 this class of mine 中所示,其中显示了 API 应该使用:
- 从授权服务器下载令牌签名 public 密钥
- 将 public 密钥提供给一个库,然后它将以加密方式验证 JWT
- 同时检查发行人、受众和算法是否符合预期
.Net Core 会自动为您完成此操作,因此请使用 Curity 代码示例方法,因为您将编写更少的代码。
一如既往,RTFM 是个好方法。我需要调用内省端点来验证我的令牌。此处也有解释:https://connect2id.com/products/server/docs/api/token-introspection
然后我使用了一个 Nuget 包来做这件事,它工作正常。
无论如何感谢你的帮助和闪电加里:)