首页 > 解决方案 > 配置一个 asp.net 核心 Web 应用程序以验证来自 ADFS 的 JWT 令牌

问题描述

我正在使用 ADFS 2019,场景是:

我的目标是:

通过使用 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。

标签: asp.net-corejwtadfs

解决方案


推荐阅读