如何从本地运行的非交互式进程获取Azure Access目录访问令牌,而不共享机密?

如何从本地运行的非交互式进程获取Azure Access目录访问令牌,而不共享机密?,azure,oauth-2.0,azure-active-directory,Azure,Oauth 2.0,Azure Active Directory,在Azure Active Directory上验证非交互式进程的标准模式是: 在Azure上运行服务时使用 当托管标识不可用时,请使用 但是#1不适用于本地运行的服务,而#2需要共享机密,这增加了很多操作复杂性—密钥存储、保护和轮换 问题: 对于Azure Active Directory已与Active Directory联合的设置(请参见图表),是否有一种方法可以让本地运行的非交互式服务在不共享任何机密的情况下从Azure Active Directory获取访问令牌?所有必需的信任关系似

在Azure Active Directory上验证非交互式进程的标准模式是:

  • 在Azure上运行服务时使用
  • 当托管标识不可用时,请使用
  • 但是#1不适用于本地运行的服务,而#2需要共享机密,这增加了很多操作复杂性—密钥存储、保护和轮换

    问题: 对于Azure Active Directory已与Active Directory联合的设置(请参见图表),是否有一种方法可以让本地运行的非交互式服务在不共享任何机密的情况下从Azure Active Directory获取访问令牌?所有必需的信任关系似乎都已到位,但有没有办法做到这一点


    简短的回答是

    组件
  • 联合到Active Directory的Azure Active Directory租户,能够使用Windows身份验证进行单点登录
  • 授予用户模拟权限的应用程序注册
  • 针对MSAL请求的特定配置
  • 细节 为了实现这一点,您需要代表流使用OAuth 2.0,为此,您需要在AAD上创建应用程序注册。确保对希望本地应用程序能够访问的每个API的“用户模拟”范围“授予管理员同意”。典型的例子有:

    • Azure密钥Vault.user\u模拟
    • Azure SQL数据库.user\u模拟
    • Azure Storage.user\u模拟
    • Microsoft Graph.user\u模拟
    但实际上,没有限制。另外,请注意,由于您没有授予任何权限,因此对安全性的影响最小。您只是允许任何能够对此应用程序注册进行身份验证的用户继续并尝试以其自己的权限访问授予的资源

    应用程序注册完成后,您需要使用以下代码获取令牌:

    const string ApplicationRegistrationId = "the id";
    const string Tenant = "YourDomain.com";
    
    // Any user name will do as long as it's in your domain. This is because AAD will redirect the request to the federated Identity Provider, which will then use Kerberos, which will the real user.
    const fakeUsername = "anything@YourDomain.com";
    
    // The user_impersonation scopes you want to access. They need to have been granted on the Application Registration. The example below is for Azure Storage:
    var scopes = new string[] { "https://storage.azure.com/user_impersonation" };
    
    var app = PublicClientApplicationBuilder.Create(ApplicationRegistrationId).WithAuthority(Tenant).Build();
    var authenticationResult = await app.AcquireTokenByIntegratedWindowsAuth(scopes).WithUsername(fakeUsername).ExecuteAsync();
    // Go ahead and use the AccessToken from authenticationResult.AccessToken
    
    图解

    笔记 我还没有发现上述方法在其他任何地方被记录在案,但它被证明是有效的,并且考虑到它消除了分享任何秘密的需要——没有管理、轮换等——如果看到微软将其记录在案,那就太好了


    它在具有混合设置的公司环境中特别适用和有用,即本地运行的服务和部署到Azure的资源。

    这将基本上作为用于运行流程的用户运行请求?是吗?是的,这就是我的想法。这没什么特别的,除了不需要分享任何秘密。