You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.Net Core使用Windows模拟调用MS Graph API出现WS-Trust解析错误怎么解决

问题根因

Windows系统的HTTP代理配置是用户级别的,而非全局生效:

  • 不加模拟逻辑时,程序读取的是应用池运行身份的代理配置,该身份没有配置Fiddler代理,所以请求正常。
  • 调用WindowsIdentity.RunImpersonated模拟登录用户后,程序上下文切换为对应的Windows用户,会自动读取该用户的系统代理配置。你之前测试Fiddler时,代理配置被写入了当前登录用户的系统设置中,即使你删除了代码里的代理配置,模拟后还是会读取用户级的系统代理,导致请求走Fiddler触发安全校验失败。

解决方案

方案1(最可靠,优先推荐):显式给MSAL指定无代理的HTTP客户端

通过实现IMsalHttpClientFactory强制MSAL的HTTP请求不使用任何代理,优先级高于系统配置,不受模拟用户的设置影响:

  1. 首先实现自定义HTTP客户端工厂:
public class NoProxyHttpClientFactory : IMsalHttpClientFactory
{
    private static readonly HttpClient _noProxyClient;

    static NoProxyHttpClientFactory()
    {
        var handler = new HttpClientHandler
        {
            UseProxy = false,
            Proxy = null
        };
        _noProxyClient = new HttpClient(handler);
    }

    public HttpClient GetHttpClient()
    {
        return _noProxyClient;
    }
}
  1. 构造PublicClientApplication时注入该工厂:
var clientApp = PublicClientApplicationBuilder
    .Create(_apiSettings.Value.AzureClientId)
    .WithTenantId(_apiSettings.Value.AzureTenantId)
    // 注入无代理的HTTP客户端工厂
    .WithHttpClientFactory(new NoProxyHttpClientFactory())
    .Build();

方案2:清理模拟用户的系统代理配置

登录到服务器,切换到你模拟的Windows用户账号,进入「Windows设置 > 网络和Internet > 代理」,关闭所有代理开关(包括自动检测代理、手动设置代理)即可。该方案依赖环境配置,换用户/换环境可能再次触发问题。


额外优化建议

你当前代码中使用.Result同步等待异步操作,在ASP.NET Core环境下容易引发线程死锁,建议改用RunImpersonatedAsync异步重载:

var user = (WindowsIdentity)HttpContext.User.Identity;
AuthenticationResult token = await WindowsIdentity.RunImpersonatedAsync(user.AccessToken, async () =>
{
    return await clientApp.AcquireTokenByIntegratedWindowsAuth(new string[] { _apiSettings.Value.MicrosoftGraphApiScopeUrl }).ExecuteAsync();
});

内容的提问来源于stack exchange,提问作者IKIKN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:30:04