无需用户干预即可访问 Web API 的 AD FS 访问令牌

AD FS access token to web API without user intervention

正在寻找一种获取应用程序访问令牌的方法,该令牌可以在不让用户登录的情况下调用 API。我已经使用 Azure AD 完成了这个用例,在那里我获得了一个应用程序访问令牌将文档写入 SharePoint 库。我对本地 AD FS 以及如何使用客户端密钥访问获取访问令牌不够熟悉,因此我不必干扰用户。

背景
我们在一组 API 上构建了一个自定义帮助台应用程序。我们的目标是能够从需要创建票证的其他系统(应用程序)创建票证。我的想法是生成一个具有 API 权限的访问令牌,这样我就可以在不提示用户登录的情况下创建票证,因为在某些情况下票证不会特定于用户。

示例用例
我们有一个应用程序可以让非员工访问我们环境中的资源。这些非员工有与他们相关联的结束日期,当结束日期过去并且他们事先没有更新时,需要为团队生成一张票以更新他们在 AD 中的记录。

我做了什么
我在 AD FS 中创建了一个 'server application' 并生成了一个客户端密码。我可以使用客户端密钥发出请求并获取访问令牌,但是,对于我需要调用的 Wep API 来说,这不是 'linked'。

我如何授予服务器应用程序访问网络的权限API?

额外 我们在 Server 2016 上使用 AD FS。

您需要 confidential client 流程。

本质上,您配置一个应用程序和一个网站 API。

默认情况下,应用程序有权调用该 Web API,但您可以尝试使用访问控制策略。

另请注意,您可以在 Web 上配置声明规则 API。

This 也可能有用。

发现问题导致我通过服务器应用程序接收的令牌给我来自 API 的 'Authorization denied' 响应。

事实证明 AD FS 配置是正确的,问题出在我的 API 与有效受众和有效发行者之间。

app.UseActiveDirectoryFederationServicesBearerAuthentication(new ActiveDirectoryFederationServicesBearerAuthenticationOptions
        {
            MetadataEndpoint = ConfigurationManager.AppSettings["ADFS:MetadataEndpoint"],
            TokenValidationParameters = new TokenValidationParameters()
            {
                ValidAudiences = GetValidAudiences(),
                ValidIssuers = GetValidIssuers()
            }
        });

我需要在访问令牌中包含服务器应用程序提供的颁发者和受众

有效发行人示例

microsoft:identityserver:{appIdentifier}

有效受众示例

http://{fqdn}/adfs/services/trust

将它们添加到 validIssuer 和 validAudience 后,访问令牌完美运行。