pre*_*elb 11 authentication jquery azure-active-directory azure-ad-msal asp.net-core-webapi
我正在尝试使用此示例创建一个简单的 Azure AD 身份验证示例,但我的客户端是 JQuery。我不知道为什么当令牌显示观众是https://myportal.onmicrosoft.com/test_core_web_api_spa. 这与 Azure 中的 API 定义相匹配。唯一缺少的部分是自定义范围,user_impersonation但是当我使用 MSALclientApplication.acquireTokenSilent(tokenRequest2)进行调用以获取令牌时,我的范围与具有范围的 API 的完整 URL 匹配:
const tokenRequest2 = {
scopes: ["https://myportal.onmicrosoft.com/test_core_web_api_spa/user_impersonation"]
};
Run Code Online (Sandbox Code Playgroud)
在建立身份验证的 API 中,我正在使用此代码(我注意到使用此方法的示例并不多)
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
Run Code Online (Sandbox Code Playgroud)
API的配置是
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "myportal.onmicrosoft.com",
"TenantId": "my-tenant-guid",
"ClientId": "my-api-client-guid"
},
Run Code Online (Sandbox Code Playgroud)
我注意到许多示例显示了不同的 API 格式(我假设这些是旧版本),但公开的 API 范围在 Azure 中列为https://myportal.onmicrosoft.com/test_core_web_api_spa/user_impersonation. 我还使用 Azure 仪表板添加了客户端的 guid 以访问此公开的 API 范围。
我哪里出错了?或者,是否有使用 MSAL、JQuery 客户端和一个简单的 .Net Core Web Api 的简单示例?似乎我发现的所有示例都已过时,或者使用不同的客户端或不同的身份验证方法。
更新以显示 Azure 中用于 Web api 应用程序的公开 api 设置。
我添加了来自 Azure 的图像,显示了“公开 api”屏幕的设置。我添加了自定义范围,user_impersonation然后添加了客户端并授予它访问该范围的权限。如您所见,我的 Azure 订阅没有api://guid其他人看到的格式。当我尝试使用该api://guid格式时,出现错误The resource principal named api://guid was not found in the tenant。
我还添加了令牌的图像。该aud标签与我在 Azure 中的 web api 应用程序名称相匹配。并scp列出了我附加到我的范围请求的范围。我只是看不出还有什么可尝试的。
pre*_*elb 23
问题在于 Web API 的配置数据。当他们说ClientId他们真正想要的是“公开 API”选项下的值时,它显示“应用程序 ID URI”。我在那里放的是 Web Api 应用程序注册的 guid。下面是它的外观。
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "myportal.onmicrosoft.com",
"TenantId": "mytenant-guid",
"ClientId": "https://myportal.onmicrosoft.com/test_core_web_api_spa"
},
Run Code Online (Sandbox Code Playgroud)
注意 API 格式。
看起来,当您直接在 Azure 中注册应用程序时,公开的 API 的格式将为api://app-guid. 但是,如果您首先使用 Visual Studio 创建应用程序,则格式将默认为类似https:///myportal.onmicrosoft.com/project-name-in-visual-studio.
像这里的大多数人一样,我在这个问题上停留了一段时间,文档严重让人失望。
在遵循 MS 指南的同时,它会像这样在服务器项目中填充 appsettings 文件
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "contoso.onmicrosoft.com",
"TenantId": "e86c78e2-8bb4-4c41-aefd-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
}
Run Code Online (Sandbox Code Playgroud)
令人沮丧的是,此修复非常简单,只需使用 api:// 预先修复客户端 ID,以便它与 JWT 中的受众以及 AAD 中服务器应用程序的“公开 API”部分上的应用程序 ID URI 相匹配
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "contoso.onmicrosoft.com",
"TenantId": "e86c78e2-8bb4-4c41-aefd-918e0565a45e",
"ClientId": "api://41451fa7-82d9-4673-8fa5-69eff5a761fd",
}
Run Code Online (Sandbox Code Playgroud)