Microsoft Graph-WithCertificate-失败,并显示“提供的证书具有不可访问的密钥。”

时间:2020-06-24 21:25:07

标签: azure-active-directory microsoft-graph-api

对于Windows桌面应用程序,我正在尝试使用WithCertificate选项使用ConfidentialClientApplicationBuilder访问Exchange日历资源。当我们调用AcquireTokenForClient时,我们将收到Microsoft.Identity.Client.MsalException“提供的证书具有不可访问的密钥。”

当我们使用WithClientSecret选项时,它可以正常工作。

在客户端,该证书是从我们的一个DLL中获得的,该DLL是使用我们的代码签名证书进行代码签名的。在Azure方面,我们的代码签名证书(PFX)被转换为CER(使用Windows凭据管理器导入/导出),然后在“证书和机密”页面上上传到我们的应用程序注册中。当我调试时,从DLL中提取的证书指纹与加载到Azure中的证书的thumbrpint相匹配。

代码如下:

            assemblyPath = @"C:\Programs\MyProgramLibrary.dll";

            var cert = X509Certificate.CreateFromSignedFile(assemblyPath);
            var cert2 = new X509Certificate2(cert);

            _Application = ConfidentialClientApplicationBuilder.Create(QuicklaunchAzureAppRegistration.ClientId())
                                         .WithCertificate(cert2)
                                         .WithAuthority(new Uri(string.Format(msalAuthFormat, TenantId)))
                                         .Build();


            result = await _Application.AcquireTokenForClient(_Scopes).ExecuteAsync();

我是否在抱怨客户端或服务器端的证书,或者两者都有?它在寻找什么钥匙?可以使用代码签名证书吗?

1 个答案:

答案 0 :(得分:0)

按照您的意思,听起来像是在客户端。听起来好像客户端需要访问它似乎不可能的私钥。 是的,我相信必须使用代码签名证书。这是使用自签名证书的示例:https://github.com/Azure-Samples/active-directory-dotnetcore-daemon-v2/tree/master/2-Call-OwnApi#optional-create-a-self-signed-certificate