.NET API 无法通过授权客户端的 JWT 识别/授权 Azure AD 用户

问题描述 投票:0回答:1

我正在尝试通过我的 .NET 8 API 授权登录 NextJS 客户端应用程序(使用 msal-react)的 Azure Active Directory 用户,以便他们可以使用

[Authorize]
端点。但是,在将客户端 JWT 发送到我的 API 后,我收到 401 响应,并且我的 API 记录了
DenyAnonymousAuthorizationRequirement

我已通过 Azure 的应用程序注册注册了这两个应用程序。在我的 API 注册中,我公开了我的 API,以通过单个范围

access_as_user
授权我的客户端应用程序。我已在我的客户注册中确认了这一点作为委托许可。

在我的 .NET API 中,我正在

AzureAd
 中设置我的 
appsettings.json

配置
"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "qualified.domain.name",
  "TenantId": "My-TENANT-ID",
  "ClientId": "MY-CLIENT-ID",
  "Scopes": "access_as_user",
  "CallbackPath": "/signin-oidc"
},

然后我在我的

Program.cs

中向我的服务添加身份验证
...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(config.GetSection("AzureAd"));
...
app.UseAuthorization();
app.UseAuthentication();
...

最后,我设置了一个带有单个

[Authorize]
端点的简单控制器。

[Controller]
[Route("api")]
public class GeneralController : Controller
{
    [Authorize]
    [HttpGet("get")]
    public Task<IActionResult> Test()
    {
        return Task.FromResult<IActionResult>(Ok());
    }
}

在我的客户端应用程序中,我在用户使用 Azure AD 登录后检索我的令牌。

const { instance, accounts } = useMsal();
...
instance.acquireTokenSilent({
   scopes: [
     "api://API-CLIENT-ID/access_as_user",
   ],
     account: account,
})

我能够成功记录客户端应用程序检索到的令牌,并且在使用 https://jwt.io/ 时,我可以解码 JWT 以查找以下相关属性:

{
  "aud": "API-CLIENT-ID",
  "iss": "https://login.microsoftonline.com/CLIENT-TENANT-ID/v2.0",
  "azp": "CLIENT-CLIENT-ID",
  "name": "LOGGED-IN-USER-NAME",
  "scp": "access_as_user",
  "tid": "CLIENT-TENANT-ID",
  "ver": "2.0"
}

但是,当我将此令牌包含在我设置的通用端点的请求的授权标头中时,我会从我的 API 收到 401 响应和以下日志:

info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed. These requirements were not met:
      DenyAnonymousAuthorizationRequirement: Requires an authenticated user.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[12]
      AuthenticationScheme: Bearer was challenged.
c# azure-active-directory jwt asp.net-core-webapi azure-ad-msal
1个回答
0
投票

您在用于客户端应用程序的Azure AD应用程序中公开了您的API,比如说AAD app1,那么我想知道您是否在用于Web api的AAD应用程序(比如说app2)中添加了这个API权限?如果没有,请在 app2 添加 API 权限 -> API 权限 -> 添加权限 -> 我的 API -> 然后添加你暴露的权限。

然后,接下来,在您的 API 项目中,将

Audience
属性添加到您的 appsettings.json 中。您有 2 个 AAD 应用程序

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "qualified.domain.name",
  "TenantId": "My-TENANT-ID",
  "ClientId": "APP2_MY-CLIENT-ID",
  "Scopes": "access_as_user",
  "Audience": "clientid_of_the_app_exposed_api_which_should_be_id_if_app1"
},

顺便说一句,如果您只有1个AAD应用程序,并且在客户端应用程序中都使用它进行身份验证,并在后端API项目中进行授权,那么暴露API和添加API权限应该在同一个应用程序中操作,那么我们就不需要不需要在 appsettings.json 中设置受众(注释受众行)。

© www.soinside.com 2019 - 2024. All rights reserved.