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

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

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

nkkqxpd9

nkkqxpd91#

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

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

services.AddControllersWithViews(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
}).AddMicrosoftIdentityUI();
services.AddRazorPages();

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

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


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

<ItemGroup>
   <PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="3.1.32" />
   <PackageReference Include="Microsoft.Identity.Web" Version="2.15.3" />
   <PackageReference Include="Microsoft.Identity.Web.UI" Version="2.15.3" />
 </ItemGroup>


appsettings.json:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "tenant_id",
  "TenantId": "tenant_id",
  "ClientId": "client_id",
  "ClientSecret": "client_secret",
  "CallbackPath": "/signin-oidc"
},


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


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



这是我的测试结果



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

相关问题