asp.net-core - 配置一个 asp.net 核心 Web 应用程序以验证来自 ADFS 的 JWT 令牌
问题描述
我正在使用 ADFS 2019,场景是:
- 客户端应用程序(可信、客户端 ID 和客户端密码)
- Web Api(既充当服务器又充当客户端)
- 访问资源
我的目标是:
通过使用 postman 从 ADFS 获取令牌并调用本地启动的 Web API,该 API 必须验证此令牌。验证令牌后,它必须生成另一个令牌(代表)以访问最后一个资源。
我可以成功获得第一个令牌,指定: - 授予类型:客户端凭据 - 访问令牌 URL:https://MY-ADFS/adfs/oauth2/token - 客户端 ID - 客户端密码
如何配置我的 asp.net 核心 Web 应用程序以验证和接受此令牌?
我有所有数据:
Web 应用标识符(用于服务器)、Web 应用客户端 ID/秘密(当它充当客户端时)和 ADFS 元数据端点。
我正在尝试做这样的事情:
services
.AddAuthentication(o =>
{
o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = "https://.../adfs";
options.Audience = "urn:microsoft:userinfo"; // taken from client token using jwt.io
options.MetadataAddress = "adfs metadata address";
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = "https://.../adfs/services/trust",
ValidAudiences = new List<string> { "web app id" },
};
但它不起作用(未经授权或内部服务器错误)。
所有这些应用程序都在 ADFS 中的同一个应用程序组中。
谢谢你。
更新 1:
如果我理解正确,观众必须是 WHO 验证令牌。所以它必须是 ADFS 中的 Web Api 标识符。如果我将此标识符放在观众变量中,我会得到:观众不匹配。我与邮递员一起发送的令牌中的受众确实不同:urn:microsoft:userinfo!
更新 2:
我已经设法访问了 web api 并获得了一个不错且有效的访问令牌。现在的问题是代币的受众是这样的:
"aud": "microsoft:identityserver:ADFS 上的 web api id"
当我必须“代表”时,“microsoft:identityserver”是一个问题。
它迫使我这样做:
ClientCredential clientCredential = new ClientCredential("microsoft:identityserver:client ID", "secret");
否则,它不会验证观众。但是这样做,当我这样做时:
var result = await authenticationContext.AcquireTokenAsync("resource to access' id", clientCredential, userAssertion);
它告诉我它找不到客户端 ID 为“microsoft:identity:client id”的资源,这是真的,因为 ADFS 上的资源有一个没有“microsoft:identity”部分的客户端 ID。
解决方案
推荐阅读
- laravel - 我的表单没有将图像文件提交到控制器存储功能,这是什么问题
- python - 如何在 python docx 中检测列表的样式(项目符号或编号)?
- apache-kafka - Kafka Streams GlobalKTable 主题是否需要与它将加入的 KStream 主题相同数量的分区?
- c++ - 如何检测 C++ 中的组合键输入?
- sas - 根据以值结尾的值过滤 where 条件?
- javascript - 如何压缩或最小化分块下载的视频 - JavaScript
- python - 如何将一组图像转换为 numpy 数组?
- java - 反应组件隐藏在网站页面后面
- android - java.lang.RuntimeException:无法创建类 ViewModel [Kotlin] 的实例
- angular - 如何在 Angular 10 中使用 HTML 锚链接#id inside dialog (MatDialog)