Asp.net Web api2 模拟 webClient 调用

Asp.net Web api2 impersonate on webClient call

我们有一个网站 api 有的是用户帐户 ApplicationPoolUser 使用过的可以访问 api 等使用的数据库,这些数据库工作正常。

但我正在尝试使用 webClient

在远程服务器 (sharepoint 2007) 上的文件上发送 http get 方法

这是我正在使用的:

            WindowsImpersonationContext impersonationContext = null;
            Uri uri = new Uri(Path.Combine(this.Document.path , Document.fileNameOriginal));
            Stream stream = null;

// WindowsIdentity.GetCurrent().Name return 'ApplicationPoolUser'
                try
                {
                    WindowsIdentity wi = System.Web.HttpContext.Current.Request.LogonUserIdentity;
                    impersonationContext = WindowsIdentity.Impersonate(wi.Token); 
// WindowsIdentity.GetCurrent().Name return 'CurrentRequestingUser'

                WebClient client = new WebClient() { 
                    UseDefaultCredentials = true,
                    CachePolicy = new System.Net.Cache.RequestCachePolicy(RequestCacheLevel.BypassCache)
                };

                stream = client.OpenRead(uri);
 // OpenRead Authentified on sharepoint server has ApplicationPoolUser
            }
            catch(WebException ex)
            {
                HttpWebResponse webResp = (HttpWebResponse)ex.Response;
                if(webResp.StatusCode == HttpStatusCode.NotFound)
                throw new GeneralException(Common.Enums.ExceptionMessage.NotFound, webResp.StatusDescription);
                else
                {
                    throw ex;
                }
            }

有没有办法在不打开 asp.net 身份的情况下代表用户强制进行身份验证?在 web.config/IIS 站点中。

我不希望执行整个代码只有这一小部分模拟用户请求...

我确实尝试使用 httpClient,但我发现自从 httpclient 在新线程中启动以来,它将始终使用应用程序池标识。

我可以自己创建协商电话并将其添加到请求中吗?

谢谢。

编辑: 我已经尝试删除除 Kerberos 之外的所有 AuthenticationManager,但请求仍然使用 NTLM 进行身份验证,我做错了什么?

有多种因素会导致无法进行模拟,或者更确切地说,无法委派用户凭据。

1) 如果您使用异步方法(直接或不直接),您可能会遇到身份流动问题。您可以检查以下调用是否有问题:

 System.Security.SecurityContext.IsWindowsIdentityFlowSuppressed();

这应该 return false - 如果没有,您可以将其用作参考:Calling an async WCF Service while being impersonated

2) 您必须为执行帐户启用约束委派。您有一个所谓的 Kerberos 双跃点方案。您必须允许 Sharepoint 用户充当另一个用户,否则 impersonate() 将不会按预期成功。