これは複雑な問題ですので、ご容赦ください。
シナリオ: ASHX プロキシを使用してリクエストを ArcGIS サーバーに中継します。リクエストを ArcGIS サーバーに送信するときに、ログインした ASP.NET ユーザー資格情報がプロキシによって使用されるように、ASP.NET の偽装を使用しようとしています。
問題: 偽装されたアカウント (sean.ryan-B + sean.ryan) がアクセスできることを知っていても、ArcGIS サーバーへのプロキシ リクエストは 401 で拒否されます。
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;
}
}
}
注: 次の変更は、マップ サーバーへのプロキシ リクエストが成功することを意味します。
a) web.config で ID を設定して、明示的にユーザー名とパスワードを sean.ryan-B アカウントに設定します。
-また-
b) アプリケーション プール アカウントを sean.ryan-B に設定し、web.config ファイルで偽装をオフにします。
ただし、これらの変更は本番環境では受け入れられません。
問題は次のように思われます: - ASP.NET の偽装は、同じ IIS でホストされているテスト ページと画像 (テスト 1 および 2) に対しては十分に機能しますが、マップ サーバーに対しては十分ではありません。
私の知る限り、ArcGIS マップ サーバーは Negotiate を使用し、次に Kerberos 認証を使用しています。
WireShark を使用して、成功したプロキシ リクエストを監視したところ、401 の後、プロキシが SPNEGO (Kerberos) を使用して AUTH で GET を送信することがわかりました。
ArcGIS プロキシで同様の問題が発生した人はいますか?
私の理論では、ブラウザーがプロキシと同じボックスで実行されているため、ボックス 1 の偽装は「うまく機能する」ということです。
なりすましの受け入れを防ぐために、ArcGIS Server (またはそれが使用している IIS サイト) を制限できますか?
どんな提案も歓迎します... psはこの投稿を完了するのに苦労しました-ソースコードとして検出しているため、ほとんどをコードとしてフォーマットする必要がありました!