【发布时间】:2020-04-25 09:11:42
【问题描述】:
我有使用 Graph API (.Net Core 3.1) 为用户创建扩展的代码。我有这个代码的测试项目。但我需要以用户身份进行身份验证才能创建和使用 GraphServiceClient(用户具有全局管理员角色)。
我们的目标是拥有一个为User创建schemaExtension的工作代码。
现在,要创建扩展,客户端必须具有已授予门户中注册应用程序的委托权限 Directory.AccessAsUser.All。但由于这是一个委托权限,我需要以用户身份进行身份验证(在测试代码中)。所以我的选择是身份验证提供者:
- 授权码提供者
- 代表供应商
- 交互式提供者
对于授权码提供者:
List<string> scopes = new List<string> { "Directory.AccessAsUser.All" };
IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(_appClientId.ToString())
.WithRedirectUri(_redirectUri)
.WithClientSecret(_appSecret) // or .WithCertificate(certificate)
.Build();
AuthorizationCodeProvider authProvider = new AuthorizationCodeProvider(confidentialClientApplication, scopes);
_graphServiceClient = new GraphServiceClient(authProvider);
我得到一个例外:
Microsoft.Graph.Auth.AuthenticationException:代码:authenticationChallengeRequired
对于代表提供商:
IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(_appClientId.ToString())
.WithRedirectUri(_redirectUri)
.WithClientSecret(_appSecret)
.Build();
OnBehalfOfProvider authProvider = new OnBehalfOfProvider(confidentialClientApplication, scopes);
_graphServiceClient = new GraphServiceClient(authProvider);
我明白了
NullReferenceException
当我尝试实际创建架构时在这一行:
SchemaExtension extension = await _graphServiceClient .SchemaExtensions.Request().AddAsync(schemaExtension);
对于交互式提供商:
IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
.Create(clientId)
.Build();
InteractiveAuthenticationProvider authProvider = new InteractiveAuthenticationProvider(publicClientApplication, scopes);
我明白了:
Microsoft.Identity.Client.MsalClientException :仅支持环回重定向 uri,但找到了 urn:ietf:wg:oauth:2.0:oob。在应用注册期间和创建 PublicClientApplication 对象时配置 http://localhost 或 http://localhost:port。
最后一个我完全不明白。那么如何才能使这种委托身份验证工作呢?
加法
这是创建扩展但不依赖于授权的代码:
SchemaExtension schemaExtension = new SchemaExtension
{
Id = schemaName.Trim(),
// Owner = _appClientId.ToString(),
Description = string.IsNullOrWhiteSpace(schemaDesc) ? string.Empty : schemaDesc.Trim(),
TargetTypes = new List<string>
{
"User"
},
Properties = new List<ExtensionSchemaProperty>
{
new ExtensionSchemaProperty
{
Name = "isGlobalAdmin",
Type = "Boolean"
},
new ExtensionSchemaProperty
{
Name = "isOrganizationAdmin",
Type = "Boolean"
}
}
};
SchemaExtension extension = await GraphClient.SchemaExtensions.Request().AddAsync(schemaExtension); // GraphClient here === _graphServiceClient in the code above
【问题讨论】:
-
可以分享一下代流的完整代码吗?包括 schemaExtension 对象的初始化?
-
已添加,请看补充
标签: c# .net-core azure-active-directory microsoft-graph-api azure-ad-b2c