.NET Core 2.2 WebAPI Azure AD认证IIS部署失败,IIS Express正常
使用.NET Core 2.2构建的WebAPI,通过AcquireTokenByUsernamePassword方法实现Azure AD用户名密码认证,在Visual Studio的IIS Express中运行正常,但部署到IIS后调用认证方法抛出异常,内部异常为:
The operation was canceled.
堆栈异常指向MSAL在执行实例发现的网络请求阶段被取消。
认证核心代码:
string clientId = "XXXXXXXXXXXXX"; string tenanat = "XXXXXXXXXXXXXXXXXXXX"; string authority = "https://login.microsoftonline.com/" + tenanat; string[] scopes = new string[] { "user.read" }; IPublicClientApplication app; app = PublicClientApplicationBuilder.Create(clientId) .WithAuthority(authority) .Build(); var result = await app.AcquireTokenByUsernamePassword(scopes, userName, Password).ExecuteAsync(); return result.IdToken;
检查IIS应用程序池权限
IIS默认的应用池身份(如ApplicationPoolIdentity)可能缺少出站网络访问权限,导致无法连接Azure AD端点。可以将应用池身份改为LocalSystem(测试用),或者为当前身份配置允许访问外部网络的权限。排查代理/防火墙限制
服务器的防火墙或企业代理可能拦截了对Azure AD服务端点的请求,导致请求超时被取消。需要:- 确保服务器防火墙允许出站访问
https://login.microsoftonline.com和https://login.microsoft.com的443端口 - 如果使用企业代理,需在代码中配置代理,或在服务器设置系统级代理
- 确保服务器防火墙允许出站访问
延长HttpClient超时时间
IIS环境下网络延迟可能触发默认HttpClient超时,导致请求被取消。可以自定义HttpClient并设置更长超时:// 实现简单的HttpClient工厂 public class StaticHttpClientFactory : IHttpClientFactory { private readonly HttpClient _httpClient; public StaticHttpClientFactory(HttpClient httpClient) => _httpClient = httpClient; public HttpClient GetHttpClient() => _httpClient; } // 在初始化MSAL应用时使用 var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; app = PublicClientApplicationBuilder.Create(clientId) .WithAuthority(authority) .WithHttpClientFactory(new StaticHttpClientFactory(httpClient)) .Build();启用TLS 1.2
Azure AD要求使用TLS 1.2及以上版本,若服务器未启用会导致请求失败。在WebAPI启动代码中添加强制启用TLS 1.2的逻辑:System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;也可以通过服务器注册表配置全局启用TLS 1.2。
更新MSAL版本
旧版本MSAL可能与.NET Core 2.2在IIS环境下存在兼容性问题,建议更新到与.NET Core 2.2兼容的最新MSAL NuGet包(注意:.NET Core 2.2已停止官方支持,长期来看建议升级到更高版本的.NET)。
内容的提问来源于stack exchange,提问作者Shivraj Mujumale

