【发布时间】:2020-03-07 23:55:55
【问题描述】:
我正在编写一个从另一个服务接收 POST 的服务,其中包括一个包含不记名令牌的授权标头。此令牌是从 OpenID Connect 服务器独立获得的(我们开发环境中的 Keycloak,但不一定在生产环境中)。我们的服务不需要获取或发行代币;它只需要能够验证它们。
我们正在使用带有自托管 ASP.NET WebApi(OWIN 4 等)的 .NET Framework 4.8。
配置方面,我们掌握的信息是:
- OpenID Connect 服务的 URL,例如。 'http://keycloak:8080/auth/realms/demo/'
- 客户端 ID,例如。 'js 客户端'。
目的是我们从 OpenID 服务器的元数据端点“http://keycloak:8080/auth/realms/demo/.well-known/openid-configuration”动态获取颁发者公钥。目前我有类似的东西:
WebApp.Start(startOptions, builder => {
var config = ...
// ... Set up routes etc ...
config.Filters.Add(new HostAuthenticationFilter("Bearer"));
builder.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = "js-client",
Authority = "http://keycloak:8080/auth/realms/demo/",
RequireHttpsMetadata = false,
SignInAsAuthenticationType = "Bearer",
});
builder.UseWebApi(config);
}));
控制器动作如下:
[HttpGet]
[HttpPost]
[Authorize]
public IHttpActionResult Receive([FromBody] string dto) => Ok();
目前,它总是返回 401 Unauthorized 并带有消息“授权已被拒绝” request' 与令牌的有效性无关。
Wireshark 显示我们的服务从未尝试联系 Keycloak 服务器以获取 OIDC 元数据,所以我猜授权处理程序甚至没有找到令牌。
我也查看了 UseJwtBearerAuthentication 和 UseOAuthAuthorizationServer,但它们似乎需要更多信息,而不仅仅是 OIDC 端点(这并不奇怪),或者他们需要自定义提供程序实现。
这似乎不是一个不寻常的用例,我需要实现自己的验证器,所以大概我遗漏了什么? Google 搜索出现了数百个示例,这些示例似乎仅与 ASP.NET Core 相关或不涵盖非交互式用例。
【问题讨论】:
标签: asp.net owin openid-connect