我有下面的代码(从微软学习复制),这是工作与微软罚款.图表4.54.0
var authProvider = new DelegateAuthenticationProvider(async (request) => {
// Use Microsoft.Identity.Client to retrieve token
var assertion = new UserAssertion(token.AccessToken);
var result = await clientApplication.AcquireTokenOnBehalfOf(scopes, assertion).ExecuteAsync();
request.Headers.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
});
然后我使用Microsoft.Graph5.0.0和Microsoft.Graph.Core3.0.0创建了一个新项目,这会给出一个错误,即无法找到DelegateAuthenticationProvider。
如何创建可与GraphServiceClient一起使用的AuthenticationProvider?
2条答案
按热度按时间z2acfund1#
我还没有解决你的问题,因为我从来没有用过你的代码,我只是按照这个官方文件通过代表流创建
GraphServiceClient
。我会继续尝试。这是我已经得到的,它的工作。=========================================================
就像@user2250152分享的一样,
可以通过创建IAccessTokenProvider的实现并使用Kiota抽象中的BaseBearerTokenAuthenticationProvider来完成自定义身份验证流,以代替DelegateAuthenticationProvider,如下所示
我们不能再使用
DelegateAuthenticationProvider
直接将其用于new GraphServiceClient(delegateAuthenticationProvider)
,如果我们想生成new GraphServiceClient
的auth_provider,我们必须遵循使用BaseBearerTokenAuthenticationProvider + IAccessTokenProvider
。我进行了如下测试,它可以工作,但似乎不符合代表流的要求。正如您所知,O-B-O的整个流程应该是,使用访问令牌A调用受AAD保护的Web API,然后API代码使用O-B-O流程生成新的访问令牌B以执行其他请求,例如调用图形API。
那么令牌A的作用域或角色应该类似于
api://xxxx/scope_name(.default for role)
,令牌B的作用域应该是图形API作用域,例如User.Read.All
。在我的测试中,我使用了图形客户端,这样我就不需要生成令牌B,但它仍然需要对图形客户端进行身份验证。我发现当我使用
api://xxxx/scope_name
传递令牌A来对图形客户端进行身份验证时,我会得到错误,但当令牌A由图形API作用域生成时,我会成功地对图形客户端进行身份验证。7lrncoxx2#
对于Microsoft.Graph v5.0.0,
GraphServiceClient
构造函数接受来自Azure.Identity
包的TokenCredential
示例。有许多类是从令牌凭据派生的,如
InteractiveBrowserCredential
或ClientSecretCredential
InteractiveBrowserCredential
的示例不确定,但OnBehalfOfCredential类可能与Microsoft类似。身份
UserAssertion
资源:
升级到v5:认证