简要描述
在编写使用MSAL对自定义API进行身份验证的桌面.NET核心应用程序的过程中,我遇到了一个问题:令牌不包含自定义API的必要范围--而是仅在使用Web (WAM)检索令牌时遇到问题。
背景
我正在开发一个桌面应用程序的解决方案,该应用程序调用自定义API,两者都是用.NET Core6编写的。该应用程序最好能够通过当前用户帐户对API进行身份验证,而不需要用户交互。所有客户端都连接到特定的Azure租户,因此我的理解是,使用WAM检索机器的默认Microsoft帐户应该可以完成这一任务。
另一种解决方案是使用集成Windows身份验证(IWA),但我倾向于不使用此解决方案,因为它只支持as -联邦用户--最好应用程序也支持这种情况。
前几步
我能够(交互地)使用MSAL.NET中的标准方法检索自定义API所需的令牌:
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进行身份验证:
builder.Services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));问题
当我尝试使用WAM检索令牌时会出现问题:
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'
请求的对象。
我已经尝试在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.
问题
任何帮助都是非常感谢的!
发布于 2022-07-04 09:16:10
此问题与您要传递的作用域有关:
var scopes = new[] { "User.Read", $"api://{clientId}/access_as_user" };这是两个不同API的作用域:
Graph
当您请求获取accessToken时,AAD应该只查找第一个User.Read作用域,并返回MS图形的accessToken,因此在您的观众中看到'00000003-0000-0000-c000-000000000000‘值。
尝试从数组中删除User.Read权限,并查看它是否有效。
https://stackoverflow.com/questions/72840454
复制相似问题