Startup.cs:
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { "user.read" })
.AddInMemoryTokenCaches();
字符串
我的班级:
var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { clientId+"/.default" });
型
在本地accessToken有值,所有工作,但在Azure服务器上,它返回NULL。
下面是例外:
出现一个或多个错误。(值不能为空。(参数“headers”))System.AggregateException:出现一个或多个错误。(值不能为空。(参数“headers”))-> System.ArgumentNullException:值不能为空。(参数“headers”)在Microsoft.Identity.Web.Throws.ArgumentNullException(String paramName)位于Microsoft.Identity.Web.AppServicesAuthenticationInformation.GetIdToken(IDictionary 2 headers) at Microsoft.Identity.Web.AppServicesAuthenticationTokenAcquisition.GetAuthenticationResultForUserAsync(IEnumerable
1 scopes,String authenticationScheme,String tenantId,String userFlow,ClaimsPrincipal user,TokenAcquisitionOptions tokenAcquisitionOptions)-内部异常堆栈跟踪结束-
1条答案
按热度按时间nkkqxpd91#
我没有在我的身边重现你的问题,但一切都在本地端和Azure Web应用程序中工作。你能看看我有什么,并与你的比较?
你提到了Startup.cs,所以我创建了一个.net core 3.1应用程序,我也建议你升级到一个新版本的.net,因为.net core 31对微软的支持已经结束了。
字符串
在控制器中,注入
ITokenAcquisition
,代码如下:型
这里我想说,当我们使用
GetAccessTokenForUserAsync
时,它应该用于代表用户生成访问令牌,当我们想要为我们自己的自定义API权限生成访问令牌时,格式应该是api://client_id_exposing_api/permission_name
,我也很困惑,为什么我们能够用client_id/.default
生成访问令牌。Nuget软件包:
型
appsettings.json:
型
然后我在Auzre门户中创建了一个Azure Web应用程序,我们无法再选择.net core 3.1,所以我选择了.net 6。
的数据
不要忘记在Azure广告身份验证刀片中添加重定向URL。
的
这是我的测试结果
的
要解决您的问题,恐怕您需要解释更多关于
in my case it works when running localhost but not on Azure
的信息,例如抛出异常时的异常消息,如果您添加了一些日志,您可以在需要时启用应用程序洞察。