Метод не найден: AcquireToken (System.String, Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate) - PullRequest
0 голосов
/ 06 июля 2018

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

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

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

Затем я создаю WEB 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");
            }

Я использую байтовый массив из 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)\r\n   at Microsoft.SharePoint.Client.ClientRuntimeContext.OnExecutingWebRequest(WebRequestEventArgs args)\r\n   at Microsoft.SharePoint.Client.ClientContext.GetWebRequestExecutor()\r\n   at Microsoft.SharePoint.Client.ClientContext.GetFormDigestInfoPrivate()\r\n   at Microsoft.SharePoint.Client.ClientContext.EnsureFormDigest()\r\n   at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()\r\n   at TenantManagementWebApi.Controllers.TenantController.<PutTenant>d__2.MoveNext() in C:\\Users\\levm3\\source\\repos\\TenantManagementWebApi\\Controllers\\TenantController.cs

В запрос на выполнение выдается ошибка

здесь действительно невежественны.

Обновление:

Я заметил это в моем web.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 Ответ

0 голосов
/ 31 июля 2018

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, которая, когда она будет принята, сразу же решит вашу проблему. Но может потребоваться некоторое, чтобы быть принятым, поэтому не задерживайте дыхание :)

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

Документы Microsoft - AuthenticationContext.AcquireTokenAsync Method

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

Другой вариант, если вы используете только 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...