当前位置: 首页 > 知识库问答 >
问题:

如何使用复合身份与Azure进行身份验证以访问Azure密钥库

朱鹏
2023-03-14
    null

身份验证工作流会是什么样子?有任何可用的例子吗?我们可以通过使用MSAL来实现吗?

假设我们已经创建了一个Azure密钥库,并在该库中保存了一些秘密。如何在Windows 10下运行的桌面应用程序中实现以下功能:

  • 当前Windows用户是Azure AD组GroupA的一部分,位于Azure密钥库的同一承租人之下。
  • 当当前用户从同一用户会话启动桌面应用程序时,应用程序可以访问所述密钥库中的机密。
  • 当前用户从浏览器登录到azure门户时,无法直接访问机密。
  • 如果应用程序是由不属于Azure广告组(GroupA)的另一个用户启动的,则应用程序无法访问所述密钥库中的机密。
  • 用户凭据和
  • 应用程序机密

共有1个答案

丰辰沛
2023-03-14

我要回答我的问题。简短的答案是使用

IConfidentialClientApplication.AcquireTokenOnBehalfOf(
      IEnumerable<string> scopes,
      UserAssertion userAssertion);

交互式获取的用户令牌可以用作用户断言。

长版本,因为我是一个新手用户,我将通过我发现的所有细节。事实证明,创建一个完整的可运行的.NET应用程序有很多地方,所以并不是所有的东西都与我的问题直接相关。

如果作为控制台应用程序运行,则没有直接与正在运行的应用程序关联的窗口,因此执行用户登录的最简单方法是使用系统默认的web浏览器应用程序。因此,使用返回代码的唯一方法是使用“http://localhost”或“http://127.0.0.1”的重拨URL,也就是环回URL。在运行时,MSAL将使用动态端口作为本地webserver来捕捉来自web浏览器的redir URL调用。因为它是在本地运行的,所以http://或https://都是允许的,除非有人使用DNS或主机文件劫持了“localhost”。

在“公开API”一节中设置一个API,并添加了一个作用域。

在代表工作流中,用户使用应用程序提供的范围登录,而不是直接访问密钥库资源。我们需要“设置”应用程序ID URI,并创建至少一个用于交互式登录的作用域。

创建。NET核心控制台应用程序。添加以下nuget包

<PackageReference Include="Microsoft.Identity.Client" Version="4.18.0" />
<PackageReference Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="5.2.8" />
<PackageReference Include="Microsoft.Azure.KeyVault" Version="3.0.5" />

下面是使用复合标识访问密钥库的代码


const string AppClientId = "[Enter_your_Application_(client)_ID";
const string AppClientSecret = "[Enter_your_Application_(secret)";
const string TenantId = "[Enter_your_tenantId]";
const string KeyVaultBaseUri = "https://[your_keyvault_name].vault.azure.net/";

// In on-behalf-of flow, the following scope needs to be consented when acquiring the user token. Otherwise, the app cannot access the key vault on-behalf-of user.
const string KeyVaultUserImScope = "https://vault.azure.net/user_impersonation";
// In on-behalf-of flow, the following scope is used to access key vault data when acquiring client token
const string KeyVaultScope = "https://vault.azure.net/.default";
// An "Exposed API" in app registration is required when using on-behalf-of flow. 
const string AppClientScope = "[Enter_your_Application_ID_URI]/[Enter_Your_Scope_Name]";
const string Instance = "https://login.microsoftonline.com/";

Console.WriteLine("Acquire User token");
var pubClient = PublicClientApplicationBuilder.Create(AppClientId)
                .WithAuthority($"{Instance}{TenantId}")
                .WithRedirectUri("http://localhost")    // Make sure the "http://localhost" is added and selected as the app Redirect URI
                .Build();
var userResult= pubClient
                .AcquireTokenInteractive(new[] {AppClientScope })
                .WithExtraScopesToConsent(new [] {KeyVaultUserImScope})
                .WithPrompt(Prompt.Consent)
                .ExecuteAsync().Result;

// In normal case, when user token is directly given from outside, we should validate if the user Result has consented to the required customized scope AppClientScope before proceeded with next steps. Here we will ignore this step.


Console.WriteLine("Acquire Client token");
// The following two steps are equivalent to https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow#middle-tier-access-token-request
var conClient = ConfidentialClientApplicationBuilder.Create(AppClientId)
                .WithAuthority($"{Instance}{TenantId}")
                .WithClientSecret(AppClientSecret)
                .Build();

            
var OboResult= conClient.AcquireTokenOnBehalfOf(
                    new[] {KeyVaultScope},
                    new UserAssertion(userReult.AccessToken))
                .ExecuteAsync().Result;



Console.WriteLine("Access Key Vault");
var kc = new KeyVaultCredential((authority, resource, scope) =>
                {
                    Console.WriteLine($"Authority: {authority}, Resource: {resource}, Scope: {scope}");
                    return Task.FromResult(OboResult.AccessToken);
                });

var kvClient = new KeyVaultClient(kc);
var secretBundle = await kvClient.GetSecretAsync(KeyVaultBaseUri, SecretName);

Console.WriteLine("Secret:" + secretBundle.Value);

如果不使用复合标识,则可以使用azure.security.keyvault.secrets.secretclient通过以下方法之一访问密钥存储库数据

// For access policy assigned to confidential application 
var client = new SecretClient(new Uri(KeyVaultBaseUri),
                new ClientSecretCredential(TenantId, AppClientId, AppClientSecret));
var secretBundle = await client.GetSecretAsync(SecretName);
Console.WriteLine("Secret:" + secretBundle.Value.Value);
// For access policy assigned to User or Group account
var client = new SecretClient(new Uri(KeyVaultBaseUri), new InteractiveBrowserCredential());
var secretBundle = await client.GetSecretAsync(SecretName);
Console.WriteLine("Secret:" + secretBundle.Value.Value);
 类似资料:
  • 问题内容: 我正在用TastyPie制作内部API。我有 禁用身份验证规则后,我的API效果很好。启用它后,无论尝试如何,都会收到401(未经授权)的响应。 我敢肯定,一旦你看到它的实际作用,这就是其中的一件事,但与此同时,请告知如何提出请求(GET)。 问题答案: 将用户名和api_key参数添加到你的GET变量中。确保你拥有 设置时,请确保遵循docs的其他说明: ApiKey身份验证 作为要

  • 我在Azure App Service中部署了一个spring boot应用程序,该应用程序使用用户管理的身份访问Azure Key Vault。 我遵循了以下提到的步骤: 创建了用户管理标识 在Azure app Service中部署了spring boot app 通过身份选项将新创建的用户管理身份添加到应用程序服务中 在应用程序服务中IAM的角色分配下添加用户托管标识为所有者角色 创建Azu

  • 我已经在azure中创建了一个web应用,我正在使用azure AD身份验证(OpenID Connect)对我的web应用进行身份验证。但我无法在少数机器上验证web应用。 在一些机器中,它(AAD认证)在谷歌chrome中工作,而不是在IE、Edge、Firefox中工作。 删除了所有cookie和声明 清除会话并在私有模式下测试 当我试图用Azure AAD登录时。我收到了错误消息,比如“我

  • 如何将Liquibase与Azure SQL数据库和Azure Active Directory身份验证一起使用?具体地说,我想使用ActiveDirectoryPassword身份验证模式进行连接,如下所述: https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-using-azure-active-directory-auth

  • 我试图设置一个Python Azure函数,该函数将使用托管标识从密钥库检索机密。我已经给了我的函数应用程序的托管身份权限,以访问和检索密钥库中的秘密。我已经根据下面的Microsoft文档对Python脚本进行了这样的配置: https://docs.microsoft.com/en-us/python/api/overview/azure/key-vault?view=azure-python