找不到方法:AcquireToken(System.String, Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCer
Posted
技术标签:
【中文标题】找不到方法:AcquireToken(System.String, Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate)【英文标题】:the Method not found: AcquireToken(System.String, Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate) 【发布时间】:2018-12-14 10:49:26 【问题描述】:我按照以下文档创建了带有 Azure AD 应用注册的 x509 证书。
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 OfficeDe***P.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
堆栈跟踪:
at OfficeDe***P.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>
这在我的 packages.config 中
<package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.19.5" targetFramework="net461" />
【问题讨论】:
当最终用户同意多租户应用程序时,会在用户的租户中创建该应用程序的表示(服务主体)。如果应用程序是多层的(即它使用另一个应用程序,一个 API),您可以使用 knownClientApplications 告诉 AAD 也注册该服务主体。请在此处查看详细信息docs.microsoft.com/en-us/azure/active-directory/develop/…。那么,这些自动注册是否涵盖了您的用例(“我的最终目标是能够以编程方式创建 Azure AD 应用注册”)? 路易斯。 ADAL.NET 是多目标的。您能否检查所使用平台的 csproj - 查看 Microsoft.IdentityModel.Clients.ActiveDirector 的提示路径(它应该是 net45,而不是包下的另一个平台)。我提出这个建议的原因是,我们有时会看到 NuGet 包管理器在多目标 nuget 包的情况下选择了错误的平台。最后我可以看到有关 OfficeDe***P.Core.AuthenticationManager 的信息吗?也许它使用 ADAL v2.0(与 ADAL v3.x 不兼容) 您好 Jean,感谢您的帮助,OfficeDe***p 核心组件在这里:github.com/SharePoint/PnP-Sites-Core/tree/master/Core/…,在我的项目中我也有这个:PnP 核心当前使用旧版本 2.29.0
,Microsoft.IdentityModel.Clients.ActiveDirectory
包。
最好将 API 项目中使用的版本降级为 PnP 框架使用的版本,这样肯定可以工作。
与错误相关,框架正在内部调用 AuthenticationContext.AcquireToken
方法,该方法已在较新的 Nuget v3 包中被弃用。
所以,看起来 PnP 代码调用这个方法属于 v2 版本,而要使用的 v3 包的正确方法是 v3 版本的 AcquireTokenAsync
导致冲突。
参考 - OfficeDe***P Core package.config 文件
现在,我们可以看到已经有一个PR 用于更新 PnP 框架本身中的 nuget 包,一旦被接受,它将立即解决您的问题。但可能需要一些时间才能被接受,所以不要屏住呼吸:)
AuthenticationResult.AcquireToken deprecated in ADAL 3.x and how to fix.
微软文档 - AuthenticationContext.AcquireTokenAsync Method
最好将 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;
【讨论】:
谢谢 Gautam,我降级了,我没有那个错误了,但是在 GetAzureADAppOnlyAuthenticatedContext 方法中它停留了很多时间,然后在我的反应应用程序上我得到一个 Failed to Fetch 错误,我不是确定它是否超时或其他东西,在抛出错误之前需要大约 2 分钟。不过你的回答很详细,谢谢。 干杯,乐于助人:),关于所花费的时间,您可以在示例控制台中尝试此代码并检查吗?此外,如果您有时间,还可以在控制台应用程序中使用 v3 Nuget 包查看上述示例代码。或许,我们可能会找到一些东西。以上是关于找不到方法:AcquireToken(System.String, Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCer的主要内容,如果未能解决你的问题,请参考以下文章
找不到方法:'System.Object Microsoft.EntityFrameworkCore.Infrastructure.IAnnotatable.get_Item(System.Strin
找不到方法“com.amazon.ion.system.IonBinaryWriterBuilder”
System.MissingMethodException:找不到方法:'...EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder`1.Ha
带有 Razor 的 MVC3 抛出找不到方法:'System.Object System.Web.Mvc.ControllerBase.get_ViewModel()'
FFImageLoading 在 Android 中引发异常并出现错误:System.TypeLoadException:由于找不到方法,无法加载方法覆盖列表: