我有一个ASP.NET Web API服务,它在启用了Windows身份验证的Web服务器上运行.
我有一个基于MVC4构建的客户端站点,它运行在同一Web服务器上的不同站点上,该站点使用HttpClient从服务中提取数据.此客户端站点在启用身份模拟的情况下运行,并且还使用Windows身份验证.
Web服务器是带有IIS 7.5的Windows Server 2008 R2.
我遇到的挑战是让HttpClient通过当前的Windows用户作为其身份验证过程的一部分.我已经以这种方式配置了HttpClient:
var clientHandler = new HttpClientHandler();
clientHandler.UseDefaultCredentials = true;
clientHandler.PreAuthenticate = true;
clientHandler.ClientCertificateOptions = ClientCertificateOption.Automatic;
var httpClient = new HttpClient(clientHandler);
Run Code Online (Sandbox Code Playgroud)
我的理解是,在启用了身份模拟的情况下运行站点,然后以这种方式构建客户端应该导致客户端使用当前登录用户的模拟身份对服务进行身份验证.
这不会发生.事实上,客户端似乎根本没有进行身份验证.
该服务配置为使用Windows身份验证,这似乎完美.我可以在我的网络浏览器中访问http:// server/api/shippers并提示进行Windows身份验证,输入后我会收到请求的数据.
在IIS日志中,我看到收到的API请求没有进行身份验证并收到401质询响应.
关于这个的文档似乎很少.
我需要深入了解可能出现的问题或使用此应用程序使用Windows身份验证的其他方法.
谢谢,克雷格
windows-authentication iis-7.5 wcf-web-api asp.net-mvc-4 asp.net-web-api
下面是我试图在异步方法中将Thread.CurrentPrincipal设置为自定义UserPrincipal对象的简化版本,但是自定义对象在离开await后会丢失,即使它仍然在新的threadID 10上.
有没有办法在await中更改Thread.CurrentPrincipal并在以后使用它而不传入或返回它?或者这不安全,永远不应该异步?我知道有线程更改,但认为async/await将为我处理同步.
[TestMethod]
public async Task AsyncTest()
{
var principalType = Thread.CurrentPrincipal.GetType().Name;
// principalType = WindowsPrincipal
// Thread.CurrentThread.ManagedThreadId = 11
await Task.Run(() =>
{
// Tried putting await Task.Yield() here but didn't help
Thread.CurrentPrincipal = new UserPrincipal(Thread.CurrentPrincipal.Identity);
principalType = Thread.CurrentPrincipal.GetType().Name;
// principalType = UserPrincipal
// Thread.CurrentThread.ManagedThreadId = 10
});
principalType = Thread.CurrentPrincipal.GetType().Name;
// principalType = WindowsPrincipal (WHY??)
// Thread.CurrentThread.ManagedThreadId = 10
}
Run Code Online (Sandbox Code Playgroud) c# asynchronous claims-based-identity async-await current-principal