azure - 用于对用户进行身份验证的 Azure 应用程序
问题描述
我正在尝试创建一个 .NET 控制台应用程序来对 Azure 函数应用程序的用户进行身份验证。我想使用他们的 AD 凭据对用户进行身份验证,然后基于此创建一个令牌。我相信我需要启用“公共客户流”才能实现这一目标。我对此很陌生,但在多次尝试失败后,我在“公开 API”部分设置了应用程序 ID URI 和范围后设法让它工作。我相信清单将此属性称为“identifierUris”。根据一些发现,公共访问和标识符Uris 不能同时使用。有没有其他方法可以实现这一目标?关于为什么这不理想的任何解释或推理也将不胜感激。
这是我们用来检索令牌并使用它的代码:
var publicClient = PublicClientApplicationBuilder
.Create(clientId)
.WithAuthority(authorityUri)
.WithRedirectUri(redirectUri)
.Build();
var accessTokenRequest = publicClient.AcquireTokenInteractive(scopes);
var accessToken = await accessTokenRequest.ExecuteAsync();
restRequest.AddHeader("authorization", "Bearer " + token);
这是创建 Azure AD 应用程序的 Pulumi 代码,我们尝试授权functionApp
的代码在哪里:Pulumi.Azure.AppService.FunctionApp
var azureApp = new AzureAD.Application(name, new AzureAD.ApplicationArgs
{
DisplayName = name,
AvailableToOtherTenants = false,
Homepage = "https://VisualStudio/SPN",
Oauth2AllowImplicitFlow = true,
ReplyUrls = { "http://localhost" },
IdentifierUris =
{
functionApp.DefaultHostname.Apply(dnsName => "https://" + dnsName)
},
PublicClient = true
}, new CustomResourceOptions {DependsOn = functionApp});
当PublicClient
设置为 false 时,这可以正常部署。当它设置为true
时,底层 API 调用会返回 400 错误并显示以下文本:
Property identifierUris is invalid
所以我们设置PublicClient
为 false,然后在门户中手动将其更新为 true,效果很好:
我们缺少什么?
解决方案
您不需要设置PublicClient
为,true
因为它适用于 ROPC 流、设备代码流或 Windows 集成身份验证流,如您的屏幕截图所示。
但是根据您的代码,我认为您没有使用任何三个身份验证流程。
您应该创建一个代表 API/服务器端(您的 Azure 函数应用程序)的新应用程序注册并执行“公开 API”。
在代表客户端(.NET 控制台应用程序)的应用程序注册中添加范围/权限(由 API/服务器端公开)。
使用PublicClientApplicationBuilder
时,只需要"allowPublicClient": true
在客户端应用注册的manifest文件中进行修改即可。不要IdentifierUris
在“公开 API”部分添加或设置应用程序 ID URI 和范围,因为这应该在代表 API/服务器端的应用程序注册中完成。
推荐阅读
- angular - Angular 下载需要很长时间才能显示下载链接
- javascript - 每当使用使用响应对象的 API 时,始终出现“未定义响应”错误
- ios - iOS RunLoop 和 DispatchQueue.main.async
- python - 求从 x 到 y 的数字之和,程序将答案打印为“x+(x+1)....+y= (sum of # from x to y)”
- algorithm - 如何在 MATLAB 中使用粒子群优化函数(particleswarm),为什么我的最佳函数值显示的是 inf 值?
- ios - 无法将颤振应用程序部署到 iOS Appstore
- html - 在桌面上显示图像,但在电话浏览器中没有显示图像
- node.js - nodejs 模块中 UMD 块的代码覆盖率
- r - Base R 获取光栅图像以填充整个绘图区域
- api - 根据 REST API 规范,以下哪些是有效的 URI(统一资源标识符)?