繁体   English   中英

在 (Azure) AD 帐户下运行的服务能否透明地获取 OAuth2 令牌?

[英]Can OAuth2 tokens be obtained transparently by a service running under an (Azure) AD account?

如果这实际上是一个天真的问题,我们深表歉意。 我搜索了该主题,但只能找到两个选择:每个客户端使用客户端应用程序注册,或者需要浏览器 window 的用户密码流程。

场景:开发一个 REST API 托管在 IIS 中,通过在 Azure AD 中的应用程序注册使用令牌授权保护它。 教科书解决方案说您还在 Azure AD 中创建客户端应用程序注册,然后调用者使用客户端应用程序的客户端 ID 和密码从 login.microsoftonline.com 获取令牌。 API 中的 MSAL 代码负责为您进行验证。 到目前为止,一切都很好。

这意味着为每个潜在调用者创建一个客户端应用程序注册,特别是如果你想在 API 中授权不同的权限。

我的问题是:是否有可能在同步到 Azure AD 的域帐户下调用作为 Windows 服务运行的应用程序,并在 API 应用程序注册中将这些域帐户添加为“用户”? 调用应用程序能否以类似 NTLM 的方式透明地从 login.microsoftonline.com 获取令牌? 或者如果不在客户端服务的 app.config 中实际存储客户端密码或域帐户的用户名/密码是不可能的?

是,但令牌是 AzureAD 令牌。 不是 NTLM 或域帐户。 使它按照您想要的方式运行的是 AzureAD 同步到 AD。

主库文档: https://learn.microsoft.com/en-us/do.net/api/microsoft.identity.client?view=azure-do.net

要从操作系统中提取用户帐户的令牌,您需要使用一种称为“WAM”的技术。 只需在您的PublicClientApplicationBuilder中添加一些代理选项即可启用 WAM。

例子:

_clientApp = PublicClientApplicationBuilder.Create(_nativeClientAppID)
    // Broker pulls the AAD account from the OS.
    .WithBroker(true)
    .WithWindowsBrokerOptions(new WindowsBrokerOptions()
    {
        // GetAccounts will return Work and School accounts from Windows.
        ListWindowsWorkAndSchoolAccounts = true,

        // Legacy support for 1st party apps only.
        MsaPassthrough = true
    }).Build();

对于服务帐户,您可能需要使用该服务帐户在本地登录并向 AzureAD 进行身份验证,以便操作系统拥有可供您的代码提取的令牌。

注意:当AcquireTokenSilent失败时,您需要能够AcquireTokenInteractive并且服务帐户无法这样做。 这意味着您需要确保服务帐户的令牌永不过期。 这会降低安全性以启用您所需的工作流程。

WAM 详情: https://learn.microsoft.com/en-us/azure/active-directory/develop/scenario-desktop-acquire-token-wam

最后,如果您的代码未能获得令牌,您的代码应该有某种方式通知您。 这将提醒您需要输入该服务的凭据。 我会创建一个交互模式,可能由-login命令行参数调用,允许您向服务提供凭据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM