AD FS 访问令牌到 Web API,无需用户干预



寻找一种方法来获取无需用户登录即可调用 API 的应用访问令牌。我使用 Azure AD 完成了此用例,其中我获得了一个应用程序访问令牌,用于将文档写入 SharePoint 库。我对本地 AD FS 以及如何使用客户端密码获取访问令牌不够熟悉,因此我不必干扰用户。

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

示例用例
我们有一个应用程序,用于预配非员工以访问环境中的资源。这些非员工具有与之关联的结束日期,当结束日期已过且他们未事先续订时,需要为团队生成票证以更新其在 AD 中的记录。

我所做的
是在 AD FS 中创建了一个"服务器应用程序"并生成了一个客户端密码。我能够使用客户端密码发出请求并获取访问令牌,但是,它没有"链接"到我需要调用的 Wep API。

如何向服务器应用程序授予访问 Web API 的权限?

其他我们在服务器 2016 上使用 AD FS。

需要机密客户端流。

实质上,您需要配置应用程序和 Web API。

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

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

这也可能有用。

发现导致我通过服务器应用程序收到的令牌从 API 给我"授权被拒绝"响应的问题。

事实证明,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 后,访问令牌运行良好。

最新更新