.NET应用中如何将IIS应用池凭据作为网络凭据传递给WebAPI调用
使用IIS应用池凭据调用WebAPI的正确方式
我明白你想把硬编码的凭据换成IIS应用池的运行账户来调用WebAPI,之前的尝试没成功其实是踩了一个常见的坑——你用的Impersonate()反而帮了倒忙!
先说说为什么之前的代码不对:
当你调用WindowsIdentity.GetCurrent().Impersonate()时,如果你的ASP.NET应用开启了Windows身份验证,这个GetCurrent()拿到的是当前访问网站的用户身份(比如登录的域用户或者匿名用户),而不是IIS应用池的运行账户。所以你Impersonate之后,调用API用的是用户的身份,自然不是你想要的应用池凭据。
正确的实现方式
其实根本不需要Impersonate操作,因为CredentialCache.DefaultNetworkCredentials默认就会取当前进程的身份——也就是IIS应用池的运行账户。直接用下面的代码就行:
var request = (HttpWebRequest)WebRequest.Create("WEB API URL"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; // 直接使用默认网络凭据,对应应用池的运行账户 request.Credentials = CredentialCache.DefaultNetworkCredentials; // 建议开启预认证,避免先收到401挑战再发认证请求 request.PreAuthenticate = true;
额外注意事项
- 一定要确保IIS应用池的运行账户有访问目标WebAPI的权限,不然还是会报403或者401错误
- 如果目标WebAPI在另一台服务器上,你可能需要配置Kerberos约束委派(域环境下),不然会遇到“双跳问题”——应用池的身份无法跨机器传递,这时候会用服务器的机器账户去访问,大概率权限不足
- 如果你有特殊场景需要临时切换身份,再切回应用池账户,可以用
WindowsIdentity.RunImpersonated,但绝大多数情况下不需要多此一举
内容的提问来源于stack exchange,提问作者Rohit Naik Sawal
相关产品推荐
相关产品推荐

