大家好,我很难弄清楚为什么WindowsIdentity中的模拟无法正常工作。
我将在下面介绍这个想法和代码。
所以我的想法是我需要在我的应用程序中访问另一个应用程序API。
public async Task<UserHrtbProfileDTO> HasHrtbAccessAsync(int userId, string systemUser)
{
WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
using (identity.Impersonate())
{
using (HttpClientHandler handler = new HttpClientHandler
{
Credentials = CredentialCache.DefaultNetworkCredentials,
UseDefaultCredentials = true
})
{
using (HttpClient client = new HttpClient(handler, true))
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
string requestURI = string.Format(ConfigurationManager.AppSettings["HRTB:Profile_Url"], userId);
HttpResponseMessage response = await client.GetAsync(requestURI);
return response.RequestMessage.RequestUri.OriginalString.Contains(requestURI)
? new UserHrtbProfileDTO
{
HrtbProfileUrl = string.Format(ConfigurationManager.AppSettings["HRTB:Profile_Url"], userId),
ResponseURI = response.RequestMessage.RequestUri.AbsoluteUri,
}
: new UserHrtbProfileDTO
{
ResponseURI = response.RequestMessage.RequestUri.AbsoluteUri,
RequestURI = requestURI,
HasHrtbAccess = false,
IdentityUserName = identity.Name + "\n" + identity.IsAuthenticated + "\n" + identity.AuthenticationType + "\n" + identity.ImpersonationLevel + "\n"
};
}
}
}
}
如果我在本地IIS上运行,行为就行了,我可以访问我需要的地方,并且在我没有的地方拒绝访问。发出请求的API响应返回我期望的响应。
但是当我从服务器部署和运行时,响应是不同的,因此行为不是应该的。 我猜测请求不是从用户的角度发出的。
我可以解决问题的任何想法,建议或不同的方法。 谢谢大家。
答案 0 :(得分:0)
对我而言,它可以从web.config文件启用模拟,并将IIS应用程序池设置为经典托管管道。
如果您对其他解决方案有任何其他了解,请分享。 谢谢