.Net核心无法在服务器上生成令牌

xpszyzbs  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(219)

Startup.cs:

  1. services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
  2. .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
  3. .EnableTokenAcquisitionToCallDownstreamApi(new string[] { "user.read" })
  4. .AddInMemoryTokenCaches();

字符串
我的班级:

  1. 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)-内部异常堆栈跟踪结束-

nkkqxpd9

nkkqxpd91#

我没有在我的身边重现你的问题,但一切都在本地端和Azure Web应用程序中工作。你能看看我有什么,并与你的比较?
你提到了Startup.cs,所以我创建了一个.net core 3.1应用程序,我也建议你升级到一个新版本的.net,因为.net core 31对微软的支持已经结束了。

  1. services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
  2. .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
  3. .EnableTokenAcquisitionToCallDownstreamApi(new string[] { "user.read" })
  4. .AddInMemoryTokenCaches();
  5. services.AddControllersWithViews(options =>
  6. {
  7. var policy = new AuthorizationPolicyBuilder()
  8. .RequireAuthenticatedUser()
  9. .Build();
  10. options.Filters.Add(new AuthorizeFilter(policy));
  11. }).AddMicrosoftIdentityUI();
  12. services.AddRazorPages();

字符串
在控制器中,注入ITokenAcquisition,代码如下:

  1. var accessToken2 = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "client_id/.default" });
  2. var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "api://3743e7c8-ac84-4203-954d-78beed41b2d7/Tiny.Read" });
  3. ViewBag.token = accessToken;
  4. ViewBag.token2 = accessToken2;
  5. return View();


这里我想说,当我们使用GetAccessTokenForUserAsync时,它应该用于代表用户生成访问令牌,当我们想要为我们自己的自定义API权限生成访问令牌时,格式应该是api://client_id_exposing_api/permission_name,我也很困惑,为什么我们能够用client_id/.default生成访问令牌。
Nuget软件包:

  1. <ItemGroup>
  2. <PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="3.1.32" />
  3. <PackageReference Include="Microsoft.Identity.Web" Version="2.15.3" />
  4. <PackageReference Include="Microsoft.Identity.Web.UI" Version="2.15.3" />
  5. </ItemGroup>


appsettings.json:

  1. "AzureAd": {
  2. "Instance": "https://login.microsoftonline.com/",
  3. "Domain": "tenant_id",
  4. "TenantId": "tenant_id",
  5. "ClientId": "client_id",
  6. "ClientSecret": "client_secret",
  7. "CallbackPath": "/signin-oidc"
  8. },


然后我在Auzre门户中创建了一个Azure Web应用程序,我们无法再选择.net core 3.1,所以我选择了.net 6。


的数据
不要忘记在Azure广告身份验证刀片中添加重定向URL。



这是我的测试结果



要解决您的问题,恐怕您需要解释更多关于in my case it works when running localhost but not on Azure的信息,例如抛出异常时的异常消息,如果您添加了一些日志,您可以在需要时启用应用程序洞察。

展开查看全部

相关问题