首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WAM/MSAL中的Azure令牌对自定义API进行身份验证

使用WAM/MSAL中的Azure令牌对自定义API进行身份验证
EN

Stack Overflow用户
提问于 2022-07-02 15:54:44
回答 1查看 634关注 0票数 0

简要描述

在编写使用MSAL对自定义API进行身份验证的桌面.NET核心应用程序的过程中,我遇到了一个问题:令牌不包含自定义API的必要范围--而是仅在使用Web (WAM)检索令牌时遇到问题。

背景

我正在开发一个桌面应用程序的解决方案,该应用程序调用自定义API,两者都是用.NET Core6编写的。该应用程序最好能够通过当前用户帐户对API进行身份验证,而不需要用户交互。所有客户端都连接到特定的Azure租户,因此我的理解是,使用WAM检索机器的默认Microsoft帐户应该可以完成这一任务。

另一种解决方案是使用集成Windows身份验证(IWA),但我倾向于不使用此解决方案,因为它只支持as -联邦用户--最好应用程序也支持这种情况。

前几步

我能够(交互地)使用MSAL.NET中的标准方法检索自定义API所需的令牌:

代码语言:javascript
复制
var scopes = new[] { "User.Read", $"api://{clientId}/access_as_user" };

var client = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority("https://login.microsoftonline.com/organizations/v2.0")
    .WithRedirectUri("customApp://auth")
    .Build();

var result = await client
    .AcquireTokenInteractive(scopes)
    .ExecuteAsync();

以这种方式检索的令牌可以用于对已设置为使用Microsoft.Identity的API进行身份验证:

代码语言:javascript
复制
builder.Services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

问题

当我尝试使用WAM检索令牌时会出现问题:

代码语言:javascript
复制
var scopes = new[] { "User.Read", $"api://{clientId}/access_as_user" };

var client = PublicClientApplicationBuilder
    .Create(clientId)
    .WithBroker(true)
    .Build();

var result = await client
    .AcquireTokenInteractive(scopes)
    .WithAccount(PublicClientApplication.OperatingSystemAccount)
    .WithParentActivityOrWindow(NativeMethods.GetConsoleWindow())
    .ExecuteAsync();

返回令牌时没有出现错误,但是API不接受它,从而导致错误的IDX10511:签名验证失败。

尝试使用jwt.ms调试JWT令牌时,我可以观察到几个不同之处:

WAM令牌的听众(aud)是'00000003-0000-0000-c000-000000000000‘,而不是WAM令牌的'api://my_client_id'

  • The作用域(scp),它包括默认的'offline_access openid配置文件User.Read’,而不是为自定义API 'access_as_user'.

请求的对象。

我已经尝试在WAM上显式设置权限和重定向URI,但这似乎没有任何区别。

如果从请求中删除图形User.Read作用域,从WAM获取令牌将失败,出现以下错误,这表明它是必需的:

CAA20002: AADST90008: The user or administrator has not consented to use the application with ID xx. This happened because application is misconfigured: it must require access to Microsoft Graph by specifying at least "Sign in and read user profile" permission.

问题

  • 有问题吗?我通过WAM?
  • 检索令牌的方式有问题吗?我正在尝试做一些不受支持的事情;我可以不为此目的使用WAM吗?
  • 是API中身份验证配置的问题,而不是检索令牌的问题?

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2022-07-04 09:16:10

此问题与您要传递的作用域有关:

代码语言:javascript
复制
var scopes = new[] { "User.Read", $"api://{clientId}/access_as_user" };

这是两个不同API的作用域:

Graph

  • api://{clientId}/access_as_user是MS的作用域,
  • User.Read是您的自定义资源

当您请求获取accessToken时,AAD应该只查找第一个User.Read作用域,并返回MS图形的accessToken,因此在您的观众中看到'00000003-0000-0000-c000-000000000000‘值。

尝试从数组中删除User.Read权限,并查看它是否有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72840454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档