AcquireTokenAsyn c получает код состояния ответа не указывает на успех: 401 (не авторизован) - PullRequest
0 голосов
/ 16 марта 2020

Как часть ECR, я изменяю наш код, чтобы получить токен, используя имя субъекта вместо отпечатка нашего стороннего приложения. Я сделал несколько изменений: 1. Я добавил имя субъекта в «имя субъекта + издатель» на портале aad. 2. добавил параметр «sendX5 c: true» в вызов функции AcquireTokenAsyn c.

Я получаю сертификат со своего компьютера, но при попытке получить токен я получаю это исключение : AADSTS7000213: Неверная цепочка сертификатов. с внутренним исключением «Код статуса ответа не указывает на успех: 401 (не авторизован)».

Есть идеи, что я делаю неправильно или чего не хватает?

Я перешел по этой ссылке: https://aadwiki.windows-int.net/index.php?title=Subject_Name_and_Issuer_Authentication

1 Ответ

0 голосов
/ 17 марта 2020

Если вы хотите запросить Azure токен доступа AD с клиентским сертификатом, выполните следующие действия

  1. Загрузите информацию о сертификате в Azure

    а. получить информацию

     $Thumbprint="930CFA423637129DB45921320B0BB451BD58A813"
    $cert=Get-ChildItem -Path Cert:\LocalMachine\My\$Thumbprint
    $rawCert = $cert.GetRawCertData()
    $base64Cert = [System.Convert]::ToBase64String($rawCert)
    $rawCertHash = $cert.GetCertHash()
    $base64CertHash = [System.Convert]::ToBase64String($rawCertHash)
    $KeyId = [System.Guid]::NewGuid().ToString()
    

    б. загрузить вышеуказанную информацию в Azure

      Connect-AzureAD

    $clientAadApplication=Get-AzureADApplication -Filter "AppId eq '<you client id>'"

    New-AzureADApplicationKeyCredential -ObjectId $clientAadApplication.ObjectId  -CustomKeyIdentifier "$base64CertHash"  -Type AsymmetricX509Cert -Usage Verify -Value $base64Cert
Получить токен доступа (я использую sdk Microsoft.Identity.Client)
              String subjectname="";




                X509Store store = new X509Store(StoreName.My,StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadOnly);
                X509Certificate2Collection certCollection = store.Certificates;

                X509Certificate2Collection currentCerts = certCollection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
                X509Certificate2Collection signingCert = currentCerts.Find(X509FindType.FindBySubjectName, subjectname, false);
                X509Certificate2 cer = signingCert.OfType<X509Certificate2>().OrderByDescending(c => c.NotBefore).FirstOrDefault();

                var app = ConfidentialClientApplicationBuilder.Create("<client id>")
                   .WithAuthority(AzureCloudInstance.AzurePublic, "<tenant id>")
                   .WithCertificate(cer)
                   .Build();
                var result = await app.AcquireTokenForClient(new[] { "https://graph.microsoft.com/.default" }).ExecuteAsync();
                Console.WriteLine(result.AccessToken);
                Console.Read();

enter image description here

Подробнее см. В документе и образец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...