ASHX отправляет HttpWebRequest с включенным олицетворением, который работает с URL-адресами на том же сервере, но не на удаленном сервере ArcGIS

Это сложный вопрос, так что терпите меня.

Сценарий: использование прокси ASHX для передачи запроса на сервер ArcGIS. Попытка использовать олицетворение ASP.NET, чтобы вошедшие в учетные данные пользователя ASP.NET использовались прокси-сервером при отправке запроса на сервер ArcGIS.

Проблема: в запросе прокси к ArcGIS серверу 401 отказано, хотя я знаю, что у олицетворенной учетной записи (sean.ryan-B + sean.ryan) есть доступ.

Есть 4 машины:

1. machine hosting proxy page.  I am logged in as: sean.ryan-B
2. a test machine. I am logged in as sean.ryan-B
3. my laptop. I am logged in as sean.ryan
4. the arcgis server.

All 4 machines are on the same domain.

web.config:
  <authentication mode="Windows"/>
   <identity impersonate="true" />  <!-- userName="EUROPE\sean.ryan-B" password="xxx" -->
  <authorization>
    <deny users="?"/>
  </authorization>

Test-1. Opening a test page, in same web app as proxy, via the proxy:
http://myHost.com/sean/ProxyAsp.Net/ArcGisProxy.ashx?http://myHost.com/sean/ProxyAsp.Net
[ok on all boxes 1-3]

This looks OK - the impersonation seems look OK, 
since with impersonation OFF:    WindowsIdentity.GetCurrent().Name = the AppPool account
    with impersonation ON:    WindowsIdentity.GetCurrent().Name = EUROPE\sean.ryan or EUROPE\sean.ryan-B

Test-2. opening an image that is hosted on the same IIS (but a different site), via the proxy:
http://myHost.com/sean/ProxyAsp.Net/ArcGisProxy.ashx?http://myHost.com:10400/sites/CaSPER/SiteAssets/CaSPER.jpg
[ok on boxes 1-3]

Test-3. opening the ArcGIS map URL, via the proxy:
http://myHost.com/sean/ProxyAsp.Net/ArcGisProxy.ashx?http://mapserver1.com/ArcGIS/rest/services/Global/2D_BaseMap_SurfaceGeology/MapServer?f=json&callback=dojo.io.script.jsonp_dojoIoScript1._jsonpCallback
[fails on boxes 2,3 but succeeds on the proxy host (box 1)!]

code for the ASHX code-behind:

    public partial class ArcGisProxy : IHttpHandler, IReadOnlySessionState //ASHX     implements IReadOnlySessionState in order to be able to read from session
    {
        public void ProcessRequest(HttpContext context)
        {
            try
            {
                HttpResponse response = context.Response;

                // Get the URL requested by the client (take the entire querystring at once
                //  to handle the case of the URL itself containing querystring parameters)
                string uri = context.Request.Url.Query;
                uri = uri.Substring(1); //the Substring(1) is to skip the ?, in order to get the request URL.

                System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)WebRequest.Create(uri);

                {
                    req.Credentials = CredentialCache.DefaultCredentials; //this works on local box, with -B account.  this is the account the web browser is running under (rather than the account logged into CaSPER with, as ASHX has separate server session).

                    req.ImpersonationLevel = TokenImpersonationLevel.Impersonation;
                }

                //to turn off caching: req.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
                req.Method = context.Request.HttpMethod;
                req.ServicePoint.Expect100Continue = false;
                req.Referer = context.Request.Headers["referer"];

                // Set body of request for POST requests
                req.Method = "GET";

                // Send the request to the server
                System.Net.WebResponse serverResponse = null;
                try
                {
                    serverResponse = req.GetResponse();
                }
                catch (System.Net.WebException webExc)
                {
                    //logger.Log(GetMyUrl(), webExc, context.Request);

                    response.StatusCode = 500;
                    response.StatusDescription = webExc.Status.ToString();
                    response.Write(webExc.ToString());
                    response.Write(webExc.Response);
                    response.Write("Username = " + context.User.Identity.Name + " " + context.User.Identity.IsAuthenticated + " " + context.User.Identity.AuthenticationType);
                    response.End();
                    return;
                }

                // Set up the response to the client
                ....
                    ......

                response.End();
            }
            catch (Exception ex)
            {
                throw;
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

примечание: следующие изменения, означающие, что запрос прокси к картографическому серверу завершается успешно

а) установите идентификатор в файле web.config, чтобы явно указать имя пользователя и пароль для учетной записи sean.ryan-B:

-ИЛИ ЖЕ-

b) установите для учетной записи пула приложений значение sean.ryan-B и отключите олицетворение в файле web.config.

однако эти изменения не приемлемы для производства.

Проблема, по-видимому, заключается в следующем: - Олицетворение ASP.NET работает достаточно хорошо для тестовой страницы + изображения, размещенного на том же IIS (тесты 1 и 2), но НЕ достаточно хорошо для картографического сервера.

Насколько я знаю, картографический сервер ArcGIS использует Negotiate, а затем аутентификацию Kerberos.

С WireShark я отслеживал успешный запрос прокси и обнаружил: после 401 прокси отправляет GET с AUTH, используя SPNEGO (Kerberos)

У кого-нибудь была похожая проблема с прокси ArcGIS?

Моя теория состоит в том, что олицетворение на коробке 1 "работает лучше", потому что браузер работает на той же коробке, что и прокси.

Может ли быть ограничен ArcGIS Server (или используемый им сайт IIS) для предотвращения принятия олицетворения?

Любые предложения приветствуются... ps было тяжело пройти этот пост - пришлось отформатировать большую часть его как код, как и обнаружение его как исходного кода!

0 ответов

Другие вопросы по тегам