gpt4 book ai didi

c# - dotnet core 3.1 Web api 与 Microsoft.Identity.Web 一起验证用户和应用程序 token

转载 作者:行者123 更新时间:2023-12-02 23:54:42 26 4
gpt4 key购买 nike

TLDR:从 ADAL 迁移到 MSAL 的 WebApi 在被具有直接权限的另一个 API 调用时不再工作。 (但是,它在使用代表 token 时确实有效。)链接到底部的最小示例。

最近我开始将一些 dotnet API 从 ADAL 迁移到 MSAL。其中一些 API 直接从前端调用,其他 API 则由其他 API 使用。在对 API 的调用中, header 中存在不记名 token ,这是正常的内容。我们使用两种类型的 token :

  1. 用户/代表代币;
  2. 应用 token ,从应用身份派生的 token 。

API 使用当前最新版本的 Microsoft.Identity.Web。在我们的例子中,它既验证 token 又创建新 token 。我们注意到,在用户/代表 token 的情况下,一切都按预期进行。然而,对于应用程序 token ,我们注意到一些奇怪的事情。在这种情况下,我们特别注意到它没有通过 Controller 上的“RequireAuthenticatedUser”策略检查(默认 dotnetcore 3.1)。

两个 token 都使用相同的受众,并且两个 token 均源自 AD 中的同一应用程序注册。所以感觉不像是配置问题。

一种感觉不对的解决方法:我们注意到,如果我们覆盖 Microsoft.Identity.Web 设置的“OnTokenValidated”,并且仅在用户/代表 token 的情况下让它正常触发,我们没有遇到任何问题。

这个发现很奇怪,因为它是触发“OnTokenValidated”事件。该 token 显然已被验证。主体有一个身份和一个用户,该用户也有声明,并且有一个设置为 true 的“IsAuthenticated”标志。但是,在通过依赖项注入(inject)出现的函数链之后,发生了一些事情,使用户无效,并删除了通过 token 出现的声明。

我创建了一个最小的示例应用程序来演示该问题。请参阅https://github.com/tychok/tokenissues ,您唯一需要做的就是在“appsettings.json”中使用您自己的 ID 设置“ClientId”和“Audience”。

在此示例中,由于“Startup.cs”中第 43 至 54 行的一些特殊代码,apptokens 确实可以工作。如果该代码不存在,apptokens 将收到 401,而用户 token 继续工作。

问题是:

  1. 我们验证 token 的方法有问题吗?
  2. 我们可以做些什么来实现这一目标?

最佳答案

请检查:如果应用程序的 secret 客户端流在没有用户的情况下请求 token ,则此用户信息将为空。您可以查看available flows Acquiring Tokens · GitHub

在 Controller 方法中, protected Web API 需要验证用于调用它们的 token 是否具有正确的范围或权限:使用 [RequiredScopes] 属性:Web APIs · AzureAD. GitHub

  • 当使用代表用户范围调用的 API 时
  • 当守护程序应用程序调用应用程序角色时,将使用

例如:

[Authorize]
[RequiredScope(HomeController.scopeRequiredByAPI)
public class HomeController : Controller
{
public const string[] scopeRequiredByAPI = new string[] { "access_as_user" };
/// ...
public async Task<IActionResult> Action()
{
...
}
}

如果您请求仅应用 token ,请使用AddInMemoryTokenCaches。对于用户 token ,请考虑分布式 token 缓存。 Token cache serialization (MSAL.NET) - Microsoft Entra | Microsoft Learn

public void ConfigureServices(IServiceCollection services)
{
...
services.AddMicrosoftIdentityWebApiAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
...
}

还要检查 token 是否来自正确的端点。尝试将颁发者的 v2 enpoint 的 accessTokenAcceptedVersion 更改为 2,否则更改为 null 或 1

enter image description here

此外,在 adal 中需要静态权限的情况下,即; v1.0可能数量较多,有些可能不被用户认可。

引用文献:

  1. Web APIs · AzureAD/microsoft-identity-web Wiki · GitHub
  2. AcquireTokenSilentAsync using a cached token· GitHub

关于c# - dotnet core 3.1 Web api 与 Microsoft.Identity.Web 一起验证用户和应用程序 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73633080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com