Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找不到方法:AcquireToken(System.String,Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate)_C#_.net_Azure_Azure Active Directory_Adal - Fatal编程技术网

C# 找不到方法:AcquireToken(System.String,Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate)

C# 找不到方法:AcquireToken(System.String,Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate),c#,.net,azure,azure-active-directory,adal,C#,.net,Azure,Azure Active Directory,Adal,我按照以下文档创建了一个带有Azure AD应用程序注册的x509证书 我生成了.pfx文件,设置了密码,并在我的租户Azure AD中注册了该应用程序,然后用keycredentials部分更新了清单 然后,我创建了一个WEB API,它接收一些参数,包括.pfx文件 [HttpPut] public async Task<IHttpActionResult> PutTenant([ModelBinder(typeof(TenantModelBinder))]

我按照以下文档创建了一个带有Azure AD应用程序注册的x509证书

我生成了.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");
            }
堆栈跟踪:

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
在Microsoft.SharePoint.Client.ClientRuntimeContext.OnExecutingWebRequest(WebRequestEventArgs args)\r\n在Microsoft.SharePoint.Client.ClientContext.GetWebRequestExecutor()上的OfficeDevPnP.Core.AuthenticationManager.c\u显示Class36\u 0.b\u 0(对象发送方,WebRequestEventArgs args)\r\n\r\n位于Microsoft.SharePoint.Client.ClientContext.GetFormDigestInfoPrivate()\r\n位于Microsoft.SharePoint.Client.ClientContext.EnsureReformDigest()\r\n位于Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()\r\n位于TenantManagementWebApi.Controllers.TenantController.d\u 2.MoveNext()在C中:\\Users\\levm3\\source\\repos\\TenantManagementWebApi\\Controllers\\TenantController.cs
错误将在executequery中抛出

这里真的很无聊

更新:

我在我的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" />

PnP Core当前使用的是
Microsoft.IdentityModel.Clients.ActiveDirectory
软件包的较旧版本
2.29.0

最好的办法是将API项目中使用的版本降级为PnP框架使用的版本,该版本肯定会工作

与此错误相关,框架正在内部调用
AuthenticationContext.AcquireToken
方法,该方法在较新的Nuget v3包中已被弃用

因此,看起来PnP代码正在调用此方法属于v2版本,而v3包要使用的正确方法是导致冲突的v3版本的
AcquireTokenAsync

参考文件

现在,我们可以看到,已准备好更新PnP框架本身中的nuget包,一旦被接受,将立即解决您的问题。但是可能需要一些时间才能被接受,所以不要屏住呼吸:)

Microsoft文档-

因此,最好将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;
}

当最终用户同意多租户应用程序时,将在用户的租户中创建该应用程序的表示(服务主体)。如果应用程序是多层的(即,它使用另一个应用程序、API),则可以使用knownClientApplications通知AAD也注册该服务主体。详情请看这里。那么,这些自动注册是否涵盖了您的用例(“我的最终目标是能够以编程方式创建Azure广告应用程序注册”)?Luis。ADAL.NET是多目标的。请您在csproj中检查使用的平台,查看Microsoft.IdentityModel.Clients.ActiveDirector的提示路径(它应该是net45,而不是软件包下的另一个平台)。我提出这个建议的原因是,在多目标NuGet包的情况下,我们有时会看到NuGet包管理器选择错误的平台。最后,我可以查看关于OfficeDevPnP.Core.AuthenticationManager的信息吗?也许它使用的是ADAL v2.0(与ADAL v3.x不兼容)Jean您好,谢谢您的帮助,OfficeDevPnp核心组件在这里:,在我的项目中,我也有这样一个:我的项目是.net 4.6.1,关于平台,它说AnyCPUI我想我知道问题是什么,但我不知道如何解决它,首先,我的asp.net webapi基本上受到Azure AD的保护,通过使用标准的startup.auth.cs机制:,因此我的项目引用该程序集;其次,我使用office PnP nuget包进行Sharepoint操作,如上面解释的第一个链接所示,使用AppOnly策略,我可以使用office PnP执行任何Sharepoint操作。所以这里有一个dll冲突,我不知道如何解决。@Jean MarcPrieur考虑到我最后的建议,最好的解决方法是什么?我在想,也许不用下载nugetpackage,我可以手动下载office pnp core软件包并更新引用的AD dll?感谢Gautam,我降级了,我不再有那个错误,但是在GetAzureADAppOnlyAuthenticatedContext方法中,它停留了很多时间,然后在我的react应用程序上,我得到了一个无法获取的错误,我不确定它是否超时或什么的,在抛出错误之前大约需要2分钟。不过,您的答案非常详细,谢谢。干杯,很乐意帮助:),关于所花费的时间,您可以在示例控制台中尝试此代码并检查吗?另外,如果您有时间,也可以在控制台应用程序中使用V3NuGet包检查上述示例代码。也许,我们会找到一些东西。
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;
}