(Azure) AD 帐户下的服务 运行 能否透明地获取 OAuth2 令牌?
Can OAuth2 tokens be obtained transparently by a service running under an (Azure) AD account?
如果这实际上是一个幼稚的问题,我们深表歉意。我搜索了该主题,但只能找到两个选择:每个客户端使用客户端应用程序注册,或者需要浏览器的用户密码流程 window.
场景: 开发一个托管在 IIS 中的 REST API,通过 Azure AD 中的应用程序注册使用令牌授权保护它。教科书解决方案说您还在 Azure AD 中创建客户端应用程序注册,然后调用者使用客户端应用程序的客户端 ID 和机密从 login.microsoftonline.com 获取令牌。 API 中的 MSAL 代码负责为您进行验证。到目前为止一切顺利。
这意味着为每个潜在调用者创建一个客户端应用程序注册,特别是如果您想在 API 中授权不同的权限。
我的问题是:是否可以调用 运行 作为 Windows 服务所说的应用程序,在同步到 Azure AD 的域帐户下,并将这些域帐户添加为 'users' 在 API 应用注册?调用应用程序能否以类似 NTLM 的方式透明地从 login.microsoftonline.com 获取令牌?或者如果不在客户端服务的 app.config 中实际存储客户端密码或域帐户的 username/password 是不可能的?
是,但令牌是 AzureAD 令牌。不是 NTLM 或域帐户。使它按照您想要的方式运行的是 AzureAD 同步到 AD。
主要图书馆文件:
https://docs.microsoft.com/en-us/dotnet/api/microsoft.identity.client?view=azure-dotnet
要从 OS 中提取用户帐户的令牌,您需要使用一种称为“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 进行身份验证,以便 OS 具有可供您的代码提取的令牌。
注意:当 AcquireTokenSilent
失败时,您需要能够 AcquireTokenInteractive
而服务帐户无法这样做。这意味着您需要确保服务帐户的令牌永不过期。这是为了启用您所需的工作流程而降低的安全性。
WAM 的详细信息:
https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-desktop-acquire-token-wam
最后,如果无法获取令牌,您的代码应该有某种方式通知您。这将提醒您需要输入该服务的凭据。我会制作一个交互模式,可能由 -login
命令行参数调用,允许您向服务提供凭据。
如果这实际上是一个幼稚的问题,我们深表歉意。我搜索了该主题,但只能找到两个选择:每个客户端使用客户端应用程序注册,或者需要浏览器的用户密码流程 window.
场景: 开发一个托管在 IIS 中的 REST API,通过 Azure AD 中的应用程序注册使用令牌授权保护它。教科书解决方案说您还在 Azure AD 中创建客户端应用程序注册,然后调用者使用客户端应用程序的客户端 ID 和机密从 login.microsoftonline.com 获取令牌。 API 中的 MSAL 代码负责为您进行验证。到目前为止一切顺利。
这意味着为每个潜在调用者创建一个客户端应用程序注册,特别是如果您想在 API 中授权不同的权限。
我的问题是:是否可以调用 运行 作为 Windows 服务所说的应用程序,在同步到 Azure AD 的域帐户下,并将这些域帐户添加为 'users' 在 API 应用注册?调用应用程序能否以类似 NTLM 的方式透明地从 login.microsoftonline.com 获取令牌?或者如果不在客户端服务的 app.config 中实际存储客户端密码或域帐户的 username/password 是不可能的?
是,但令牌是 AzureAD 令牌。不是 NTLM 或域帐户。使它按照您想要的方式运行的是 AzureAD 同步到 AD。
主要图书馆文件: https://docs.microsoft.com/en-us/dotnet/api/microsoft.identity.client?view=azure-dotnet
要从 OS 中提取用户帐户的令牌,您需要使用一种称为“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 进行身份验证,以便 OS 具有可供您的代码提取的令牌。
注意:当 AcquireTokenSilent
失败时,您需要能够 AcquireTokenInteractive
而服务帐户无法这样做。这意味着您需要确保服务帐户的令牌永不过期。这是为了启用您所需的工作流程而降低的安全性。
WAM 的详细信息: https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-desktop-acquire-token-wam
最后,如果无法获取令牌,您的代码应该有某种方式通知您。这将提醒您需要输入该服务的凭据。我会制作一个交互模式,可能由 -login
命令行参数调用,允许您向服务提供凭据。