0

我正在使用 Microsoft Identity Web (MSAL) 库连接到 Graph API。[https://github.com/AzureAD/microsoft-identity-web][1]

为此,我将客户端凭据流与基于证书的身份验证一起使用。

我的配置如下

服务注册

  services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
           .EnableTokenAcquisitionToCallDownstreamApi()
           .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))
           .AddInMemoryTokenCaches();

appSettings.json

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "mydomain.onmicrosoft.com",
    "TenantId": "xxxxxxx",
    "ClientId": "yyyyyyyy",   
    "ClientCertificates": [
     {
       "SourceType": "Path",
       "CertificateDiskPath": "c:\\cert\\my-cert.pfx",
       "CertificatePassword": "password"
     }
 ] }

为此,我收到以下错误

IDW10104:客户端密钥和客户端证书都不能为空或空格,并且在调用 Web API 时,Web 应用程序的配置中只能包含 ONE。例如,在 appsettings.json 文件中。

但是,我能够使用Microsoft.Identity.Client累积令牌并与 Graph API 连接(使用客户端凭据流和基于证书的身份验证)

    private GraphServiceClient GetGraphServiceClient()
    {
        var token = GetToken();
        GraphServiceClient graphServiceClient =
            new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) =>
            {
                // Add the access token in the Authorization header of the API request.
                requestMessage.Headers.Authorization =
                        new AuthenticationHeaderValue("Bearer", token);
            })
            );
        return graphServiceClient;
    }

    private string GetToken()
    {
        var x509Certificate2 = 
            new X509Certificate2(System.IO.File.ReadAllBytes("MyCert.pfx"), "password");

        IConfidentialClientApplication app = 
            Microsoft.Identity.Client.ConfidentialClientApplicationBuilder.Create("my-client-id")
                .WithTenantId("my-tenent-id")
                .WithCertificate(x509Certificate2)
                .Build();

        // With client credentials flows the scopes is ALWAYS of the shape "resource/.default", as the
        // application permissions need to be set statically (in the portal or by PowerShell), and then granted by
        // a tenant administrator
        string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
         
        AuthenticationResult result =
                    app.AcquireTokenForClient(scopes)
                        .ExecuteAsync().Result;
        return result.AccessToken;
    }

我在这里缺少任何配置吗?

4

1 回答 1

0

关于解决方法

尝试在 Azure 应用注册中添加证书

1)转到 Azure 门户。在左侧导航窗格中,选择 Azure Active Directory 服务,然后选择应用注册

在此处输入图像描述

2)在结果屏幕中,选择Select the your application

3)在“证书和机密”选项卡中,转到“证书”部分:

4)选择上传证书,并在选择右侧的浏览按钮中选择您现有的证书。

在此处输入图像描述

5)选择添加

有关更多详细信息,请参阅此文档:https ://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/blob/master/4-WebApp-your-API/4-1-MyOrg/README -使用证书.md

于 2021-12-24T10:41:48.710 回答