调用AuthenticationParameters和AcquireToken相关方法出现报错如何解决
C# ADAL库两处报错排查方案
第一处报错
报错表现
调用代码:
string redirectUrl = ConfigurationManager.AppSettings["RedirectUrl"]; AuthenticationParameters ap = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(redirectUrl)).Result;
报错提示:非静态字段、方法或属性“AuthenticationParameters.CreateFromResourceUrlAsync(Uri)”需要对象引用
问题原因
当前项目引用的Microsoft.IdentityModel.Clients.ActiveDirectory(ADAL)版本中,CreateFromResourceUrlAsync为实例方法,不支持直接通过类名静态调用。该方法在ADAL v3.x及以上版本才调整为静态方法。
解决方法
- 方案1:升级项目的ADAL NuGet包到v3.x或更高版本,原静态调用写法可直接生效
- 方案2:保持当前ADAL版本,先实例化
AuthenticationParameters对象后再调用该方法
额外建议:异步方法尽量使用
await调用,避免使用.Result引发线程死锁问题
第二处报错
报错表现
调用代码:
AuthenticationContext authContext = new AuthenticationContext(_authority, false); AuthenticationResult result = authContext.AcquireToken(_serviceUri, clientCred);
报错提示:“AuthenticationContext”不包含“AcquireToken”的定义,找不到接受类型为“AuthenticationContext”的第一个参数的可访问扩展方法“AcquireToken”(是否缺少using指令或程序集引用?)
问题原因
- 缺少
using Microsoft.IdentityModel.Clients.ActiveDirectory;命名空间引用 - ADAL v3.x及以上版本已经移除了同步的
AcquireToken方法,仅保留异步的AcquireTokenAsync系列方法
解决方法
- 首先确认代码文件顶部已添加对应ADAL库的using指令
- 若使用ADAL v3.x及以上版本,将调用代码改为异步写法即可:
特殊场景必须同步调用的,可临时用AuthenticationResult result = await authContext.AcquireTokenAsync(_serviceUri, clientCred);.Result过渡:AuthenticationResult result = authContext.AcquireTokenAsync(_serviceUri, clientCred).Result; - 若必须使用同步
AcquireToken方法,将ADAL NuGet包降级到v2.x版本即可
内容的提问来源于stack exchange,提问作者mayur hande
相关产品推荐
相关产品推荐

