将 KeyVaultClient 与 MSAL 令牌“未经授权”结合使用

2024-04-02

桌面应用程序如何使用 Azure AD 读取 KeyVault 机密?

我能够获取 MSAL 令牌,但将其交给 KeyVaultClient 始终会导致:

Microsoft.Azure.KeyVault.Models.KeyVaultErrorException:操作返回无效的状态代码“未经授权”

我什至不确定 KeyVault 支持这种令牌,但在我的 Google 搜索中,我看到了使用旧 ADAL 令牌的示例。

我的 KeyVault 具有针对我的 Azure AD 帐户和我所属组的访问策略。

我从 MSAL 获取的 JWT 令牌的有效负载具有以下范围:

"scp": "User.Read profile openid email"

这是一个 mcve:

public partial class MainWindow : Window
{
    private static string ClientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    public static PublicClientApplication PublicClientApp = new PublicClientApplication(ClientId);

    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        var secret = await GetKeyVaultSecret("TestSecret");
    }

    private async Task<string> GetKeyVaultSecret(string secretKey)
    {
        KeyVaultClient kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(AcquireMSALToken));

        try
        {
            var secretBundle = 
                await kvClient.GetSecretAsync("https://xxxxx.vault.azure.net/", 
                    secretKey, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            return secretBundle.Value;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return null;
        }
    }

    private static async Task<string> AcquireMSALToken(string authority, string resource, string scope)
    {
        string[] _scopes = new string[] { "user.read" };

        AuthenticationResult authResult = null;
        var app = PublicClientApp;
        var accounts = await app.GetAccountsAsync();

        try
        {
            authResult = await app.AcquireTokenSilentAsync(_scopes, accounts.FirstOrDefault());
            return authResult.AccessToken;
        }
        catch (MsalUiRequiredException)
        {
            try
            {
                authResult = await PublicClientApp.AcquireTokenAsync(_scopes);
                return authResult.AccessToken;
            }
            catch (MsalException) { throw; }
        }
        catch (Exception) { throw; }
    }
}

UPDATE

仅供参考,这可行,但我认为根据文档,这不是 AzureServiceTokenProvider 的用途。这让我相信 MSAL 令牌与 KeyVault 不兼容。我的感觉是它仅用于 MS Graph 调用。

using Microsoft.Azure.Services.AppAuthentication;

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
var kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));


var secretBundle =  await kvClient.GetSecretAsync("https://xxxxxxxx.vault.azure.net/",
                    "TestSecret", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

return secretBundle.Value;

访问 Azure 密钥保管库的范围不正确。你应该使用

string[] _scopes = new string[] { "https://vault.azure.net/.default" };

您可以根据需要添加特定权限。

通常您需要完全限定每个范围,但 MS Graph API 是一个特例。它允许您使用“简短形式”,例如{user.read}.

您可以按照以下步骤向应用程序授予权限。

1.点击应用注册(预览)->点击您注册的应用程序。

2.点击API权限->点击添加权限。

3.选择Azure Key Vault。

4.单击API权限页面底部的授予管理员同意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 KeyVaultClient 与 MSAL 令牌“未经授权”结合使用 的相关文章

随机推荐

  • 使用命令式绑定时的 Azure Functions 测试

    到目前为止 我已经能够为 Azure Functions 设置单元测试 并且效果很好 然而 对于我当前的项目 我需要使用动态或命令式绑定 https learn microsoft com en us azure azure functio
  • SQL Server Management Studio 中的宏

    有没有办法在SSMS中实现文本编辑宏 我会 例如喜欢将代码转换为如下所示 但只需按键 而不是冗长的正则表达式搜索和替换 This INSERT INTO TABLE fieldOne fieldTwo VALUES
  • Learning Swift:顶层不允许使用表达式

    我正在学习斯威夫特 我遇到了一个无法解决的问题 import UIKit func helloword str String print str helloword say I use helloword say 但 Xcode 告诉我错误
  • “int '对象不可下标”

    我开始学习GEKKO 现在 我正在解决一个 knapsak 问题来学习 但是这次我收到错误 int object is not subscriptable 你能看一下这段代码吗 问题的根源是什么 我应该如何定义 1 10 矩阵 from g
  • SWI-Prolog - 显示长列表

    我正在使用 SWI Prolog 我正在尝试打印一个列表 但如果该列表有超过 9 个项目 它看起来像那样 1 15 8 22 5 19 12 25 3 有没有办法显示整个列表 看一下 http www swi prolog org FAQ
  • 在 Yii 框架中配置数据库连接

    在Yii框架的main php文件中 有一些配置选项 这就是mysql的设置方式 db gt array connectionString gt mysql host localhost dbname testdrive emulatePr
  • Pylint 警告:可能存在不平衡的元组按顺序解包

    我有一段Python代码 def func1 a set b join map str list a return b def func2 d 1 e 2 return func1 d e def main a b c d func2 if
  • Swift 中具有共享 NSUserDefaults 的 KVO

    我在通过通信 NSUserDefaults 更改在主机应用程序及其扩展之间进行通信时遇到问题 我初始化了NSUserDefaults using init suiteName 添加 KVO 观察者使用addObserver 方法并覆盖该方法
  • Lombok 未在 Netbeans 项目中工作

    我想在项目中使用Lombok来使用 Getter和 Setter 我包括使用 Maven
  • 显示图像的片段中的内存问题

    我正在使用片段来显示图像 页面 我有一个活动 主要 其中包含所有片段 package com example hscroll demo import android os Bundle import android preference P
  • 为 POCO 实施 IEquatable

    我注意到 EF 的 DbSet Add 非常慢 谷歌搜索了一下 找到了一个 SO 答案 承诺性能提升高达 180 倍 https stackoverflow com a 7052504 141172 https stackoverflow
  • 计算 SQL 中特定事件之前和之后的事件数量?

    我有一个包含日期和事件的表 有一个名为 A 的事件 我想知道 Sql Bigquery 中事件 A 之前和之后发生了多少个事件 例如 User Date Events 123 2018 02 13 D 123 2018 02 12 B 12
  • 从网络数据抓取类返回数据?

    我正在尝试创建一个类 它可以让我从网络服务获取请求的数据 我被困在如何返回值上 FooClass m DataGrabber is the class which is supposed to get values dataGrabber
  • R:使用矢量化按间隔分配值

    让我们有一个数字向量 a lt round runif 20 1 5 0 1 3 5 4 2 1 2 3 4 5 2 我需要使用如下表为这些数字分配值 1 to 2 assign A 3 to 4 assign B 5 assign C 这
  • Ruby Mixins 和实例变量

    是否有将参数传递给混合方法的最佳实践方法 使用 mixin 的类可以设置混合方法期望的实例变量 或者可以将所有必要的参数作为参数传递给混合方法 背景是我们有一个 Rails 控制器来发布内容 但其他控制器甚至模型都需要能够 充当发布者 所以
  • 错误“来源:系统进程已退出,因此请求的信息不可用”

    它在我的电脑上可以工作 但是当我放入另一台机器时 我收到错误 源 系统进程已退出 因此请求的信息不可用 并且 exe 没有出来 有哪位有经验的兄弟可以帮忙吗 赞赏 p New Process With p EnableRaisingEven
  • GooglePlayServices Admob 问题:“无法加载广告:0”

    我对新的 admob 有疑问 这是我的代码 尝试在我的主要活动中创建和加载广告 private void createAndLoadAd String adUnitID RelativeLayout rlRoot View upperVie
  • 如何创建在特定条件下对另一列进行计数的列?右

    下面 数据已被重新调整 并列出了输入和预期输出 Data structure list record id c 110101 110101 110101 110101 110101 110101 110101 110101 110101 1
  • 如何为 ruby​​ on Rails 创建 .htaccess?

    有谁知道创建 htaccess在铁轨上 请指导我 谢谢 regards 您只需在网站文档根目录中创建 htaccess 文件即可 在 apache 中 这将是您网站的文档根目录 可能类似于 var www your website com
  • 将 KeyVaultClient 与 MSAL 令牌“未经授权”结合使用

    桌面应用程序如何使用 Azure AD 读取 KeyVault 机密 我能够获取 MSAL 令牌 但将其交给 KeyVaultClient 始终会导致 Microsoft Azure KeyVault Models KeyVaultErro