Graph API 调用与 ClientSecretCredential 令牌请求有各自独立的传输入口。使用 Microsoft.Graph 5 和 Azure.Identity 时,要在构造客户端之前把两者都配置好:

var proxy = new System.Net.WebProxy(
    "http://proxy.example.net:8080");

var tokenHandler = new System.Net.Http.HttpClientHandler
{
    Proxy = proxy,
    UseProxy = true
};

var credentialOptions = new Azure.Identity.ClientSecretCredentialOptions
{
    Transport = new Azure.Core.Pipeline.HttpClientTransport(tokenHandler)
};

var credential = new Azure.Identity.ClientSecretCredential(
    tenantId, clientId, clientSecret, credentialOptions);

var authProvider =
    new Microsoft.Kiota.Authentication.Azure.AzureIdentityAuthenticationProvider(
        credential, scopes: new[] { "https://graph.microsoft.com/.default" });

var graphHttp = Microsoft.Graph.GraphClientFactory.Create(proxy: proxy);
var graphClient = new Microsoft.Graph.GraphServiceClient(
    graphHttp, authProvider);

对于无需身份验证的公共 HTTP 通路,HTTP 代理列表 可为共享的 WebProxy 提供候选地址。应用通过既有的凭据处理逻辑提供 tenantId、clientId 和 clientSecret。.default 作用域使用该注册所配置的应用权限;通路本身无法授予权限。

把这两行传输代码看作关键的一对。HttpClientTransport(tokenHandler) 负责承载凭据的令牌请求;GraphClientFactory.Create(proxy: proxy) 在保留 Graph SDK 的 HTTP 中间件构造的同时配置其 API 通路。

如果中间代理需要身份验证,请把所需账号赋给代理对象的 Credentials。在组件生命周期内保留自己创建的传输实例,并在关闭时释放它们。

请将此模式与所述 SDK 代次搭配使用。HttpProvider 与 DelegateAuthenticationProvider 的示例属于更早的代次,不能混入这条构造函数调用链。

相关文章