Azure ClientCertificateCredential -使用SNI

lhcgjxsq  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(139)

我正在尝试使用ClientCertificateCredential(在C#中)对Azure AD应用程序进行身份验证:

using Azure.Identity;
var credential = new ClientCertificateCredential("TenantId", "AppId", @"path\to\cert.pfx");

在应用程序上,我已经将证书的SNI配置为受信任的证书:

"trustedCertificateSubjects": [
    {
        "authorityId": "auth id ...",
        "subjectName": "cert subject name",
        "revokedCertificateIdentifiers": []
    }
]

我已经验证了所有的值和配置。然而,我总是遇到以下错误:
Azure.Identity.AuthenticationFailedException HResult= 0x 80131500消息=ClientCertificateCredential身份验证失败:配置问题正在阻止身份验证-有关详细信息,请查看来自服务器的错误消息。您可以在应用程序注册门户中修改配置。详情请参见https://aka.ms/msal-net-invalid-client。原始例外:AADSTS 700027:用于对客户端Assert进行签名的具有标识符的证书未在应用程序上注册。[原因-找不到密钥。,客户端使用的密钥的指纹:“”,请访问Azure门户、Graph Explorer或直接使用MS Graph查看应用ID“”的配置键。请查看www.example.com上的文档https://docs.microsoft.com/en-us/graph/deployments以确定相应的服务端点,并https://docs.microsoft.com/en-us/graph/api/application-get?view=graph-rest-1.0&tabs=http以构建查询请求URL,例如“https:graph.microsoft.com/beta/applications/”]。或者,可以在应用上配置SNI。请确保使用MSAL的WithSendX 5C()方法将客户端Assert与JWT标头中的x5 c声明一起发送,以便Azure Active Directory可以验证正在使用的证书。
我已经检查了所有提供的链接以及其他文件,没有一个有助于解决这个问题。有什么见解或方向来解决这个问题?

ctzwtxfj

ctzwtxfj1#

如果.cer证书未上载到Azure AD应用程序证书和机密刀片中,或者运行代码的计算机中不存在.pfx证书,则通常会发生错误。
当我无法在Azure AD应用程序证书和机密刀片中上传任何证书时,我遇到了相同的错误

因此,要解决此错误,请在证书和机密刀片中上传**.cer**证书:

清单如下所示:

确保运行代码的机器中存在**.pfx**证书:

对于 sample,我使用下面的代码生成了访问令牌来验证应用程序

using Azure.Core;
using Azure.Identity;
using System;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main(string[] args)
    {
        // Define the parameters for the ClientCertificateCredential
        string tenantId = "TenantID";
        string clientId = "ClientID";
        string certificatePath = @"C:\Users\rukmini\Downloads\AzureADCert.pfx";
        string certificatePassword = "****";

        // Load the certificate from the specified path and password
        X509Certificate2 certificate = new X509Certificate2(certificatePath, certificatePassword);

        // Create the ClientCertificateCredential
        ClientCertificateCredential credential = new ClientCertificateCredential(tenantId, clientId, certificate);

        //Obtain an access token to authenticate to the Azure AD application
        AccessToken token = credential.GetTokenAsync(new Azure.Core.TokenRequestContext(new[] { "https://graph.microsoft.com/.default" })).Result;

        // Print the access token
        Console.WriteLine(token.Token);
    }
}

访问令牌生成成功:

mepcadol

mepcadol2#

找到解决方案:[FEATURE REQ] DefaultAzureCredential should send x5c claim for app authentication
代码示例(为我成功工作):

var options = new ClientCertificateCredentialOptions()
{
    SendCertificateChain = true,
};
var creds = new ClientCertificateCredential(tenantId, clientId, certPath, options);

相关问题