метод не найден: AcquireToken (система.String, Microsoft.IdentityModel.Клиенты.Через ActiveDirectory.ClientAssertionCertificate)

я следовал следующему документу, чтобы создать сертификат x509 с регистрацией приложения Azure AD.

https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azuread

я сгенерировал .pfx-файл, установите пароль, и я также зарегистрировал приложение в своем клиенте Azure AD, а затем обновил манифест с помощью раздела keycredentials.

затем я создаю веб-API, который получает некоторые параметры, в том числе .файл pfx.

 [HttpPut]
        public async Task<IHttpActionResult> PutTenant([ModelBinder(typeof(TenantModelBinder))] Tenant tenant)
        {
            try
            {               
                var cert = new X509Certificate2(tenant.CertificateFile, tenant.CertificatePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

                using (var cc = new OfficeDevPnP.Core.AuthenticationManager().GetAzureADAppOnlyAuthenticatedContext(tenant.SiteCollectionTestUrl, tenant.ApplicationId, tenant.TenantDomainUrl, cert))
                {
                    cc.Load(cc.Web, p => p.Title);
                    cc.ExecuteQuery();
                };
            }
            catch (System.Exception)
            {
                return BadRequest("Configuration Invalid");
            }

я использую bytearray, поступающий из HttpRequest для создания объекта x509.

однако я получаю эту ошибку:

Message "Method not found: 'Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext.AcquireToken(System.String, Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate)'."   string

Stacktrace:

at OfficeDevPnP.Core.AuthenticationManager.<>c__DisplayClass36_0.<GetAzureADAppOnlyAuthenticatedContext>b__0(Object sender, WebRequestEventArgs args)rn   at Microsoft.SharePoint.Client.ClientRuntimeContext.OnExecutingWebRequest(WebRequestEventArgs args)rn   at Microsoft.SharePoint.Client.ClientContext.GetWebRequestExecutor()rn   at Microsoft.SharePoint.Client.ClientContext.GetFormDigestInfoPrivate()rn   at Microsoft.SharePoint.Client.ClientContext.EnsureFormDigest()rn   at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()rn   at TenantManagementWebApi.Controllers.TenantController.<PutTenant>d__2.MoveNext() in C:Userslevm3sourcereposTenantManagementWebApiControllersTenantController.cs

ошибка возникает в executequery

правда, ничего не знаешь здесь.

обновление:

я заметил это в своей сети.config

 <dependentAssembly>
        <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-3.19.5.13701" newVersion="3.19.5.13701"/>
      </dependentAssembly>

и это на мои пакеты.config

  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.19.5" targetFramework="net461" />

1 ответов


PnP Core в настоящее время использует более старую версию, 2.29.0 о Microsoft.IdentityModel.Clients.ActiveDirectory пакета.

лучше всего было бы, чтобы вы понизили версию, используемую в вашем проекте API, до версии, используемой PnP Framework, которая будет работать наверняка.

связанный с ошибкой, фреймворк вызывает AuthenticationContext.AcquireToken метод внутренне, который был устаревшим в новом пакете Nuget v3.

таким образом, похоже, что код PnP вызывает этот метод принадлежит версии v2, В то время как правильный метод пакета v3 для использования -AcquireTokenAsync версии v3, которая приводит к конфликту.

ссылка - основной пакет OfficeDevPnP.config

теперь мы видим, что это уже PR на месте, чтобы обновить пакет nuget в самой PnP Framework, который при принятии сразу решит вашу проблему. Но может понадобиться немного, чтобы тебя приняли, так что не задерживай дыхание. :)

AuthenticationResult.AcquireToken устарел в ADAL 3.X и как исправить.

Microsoft Docs -AuthenticationContext.Метод Метод Acquiretokenasync

поэтому лучше всего было бы либо понизить ваш проект API до v2, либо подождать, пока платформа PnP обновит пакет и его необходимые зависимости.

другой вариант, если вы используете только PnP для аутентификации, то вы можете использовать ниже вспомогательный метод, который не требует, чтобы вы меняли пакет. Но если вы используете другие функции, такие как подготовка или другие расширения, вам нужно, к сожалению, понизить его. Это изменено из того, что используется внутри самого PnP, чтобы использовать изменения пакета v3:

public ClientContext GetAzureADAppOnlyAuthenticatedContext(string siteUrl, string clientId, string tenant, X509Certificate2 certificate)
{
    var clientContext = new ClientContext(siteUrl);

    string authority = string.Format(CultureInfo.InvariantCulture, "https://login.windows.net/{0}/", tenant);

    var authContext = new AuthenticationContext(authority);

    var clientAssertionCertificate = new ClientAssertionCertificate(clientId, certificate);

    var host = new Uri(siteUrl);

    clientContext.ExecutingWebRequest += (sender, args) =>
    {
        var ar = authContext.AcquireTokenAsync(host.Scheme + "://" + host.Host + "/", clientAssertionCertificate).GetAwaiter().GetResult();
        args.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + ar.AccessToken;
    };

    return clientContext;
}