3

Delphi XE2 / Indy 10 では、特定の http リクエストをキャプチャする Web モジュールを含むいくつかの Web Broker プロジェクトでいくつかの作業を行ってきました。特定の一致するリクエストがない場合、ルート ディレクトリ内からファイルを検索します。今私がやろうとしているのは、IIS などの一般的な Web サーバーと同様に、特定のファイルとファイル拡張子にセキュリティを実装することです。

Indy または少なくとも Delphi XE2 に、このセキュリティを管理できるものはありますか? それとも、自分自身をカプセル化しなければならないものですか?私は自分のプロジェクトごとに異なる方法を使用しており、車輪を再発明するよりも、すべてのプロジェクトでそれを行う標準的な方法を使用したいと考えています.

4

3 に答える 3

5

Indy HTTP サーバー (TIdHTTPServer) は、Request オブジェクトのプロパティ AuthExists、AuthUser、および AuthPass と Response.AuthRealm プロパティを使用して、 HTTP 基本認証をサポートします。(NTLM またはダイジェスト認証もサポートされているかどうかは確認していません)。

レスポンスで AuthRealm プロパティを設定することにより、基本認証が必要であることがクライアントに通知されます。クライアントがリクエストでユーザー名とパスワードを送信すると、サーバーはコマンド ハンドラーでそれを確認できます。

したがって、実際には、Indy はリソースを保護するための組み込みサポートを提供します。これは、通常のブラウザーと REST クライアントの両方で機能し、リクエストに auth ヘッダーが含まれている場合にのみサーバー リソースにアクセスできます。

Indy ベースの (商用) Web フレームワークにも実装しました。サンプル コードは、サーバー上のすべてのコンテンツを保護し、ユーザー名とパスワードの組み合わせをハード コーディングしています。

procedure TBasicAuthHandlerWrapper.Handle(Target: string; Context:
  TdjServerContext;
  Request: TIdHTTPRequestInfo; Response: TIdHTTPResponseInfo);
const
  AUTH_USER = 'sherlock';
  AUTH_PASS = 'holmes';
begin
  if Request.AuthExists and ((Request.AuthUsername = AUTH_USER) and
    (Request.AuthPassword = AUTH_PASS)) then
  begin
    // pass
    inherited;
  end
  else
  begin
    // show login dialog
    Response.AuthRealm := 'Welcome to Web Components Server!';
  end;
end;

注: この例では、拡張子とパスに関係なく、すべてのリソースを保護します。しかし、これは Request.Document で使用可能なパスの条件を確認することで、メソッド本体に簡単に追加できます。

于 2013-05-09T09:15:54.010 に答える
0

例として、基本認証チェックを TIdHttpServer の「get」メソッドに直接挿入しようとしたすべてのブラウザーで正しく動作します。

procedure TForm2.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  tmpVal: string;
  ts: TStringList;
  rs: TResourceStream;
  FilePath: string;
  ReturnMainPage: Boolean;
begin
 if (edUser.Text <> '') or (edPassword.Text <> '') then
  Begin
   if (ARequestInfo.AuthPassword.ToLower <>edUser.Text.ToLower) and (ARequestInfo.AuthUsername <>edPassword.Text) then
    begin
    AResponseInfo.ResponseNo := 401;
    AResponseInfo.ResponseText := 'Authorization required';
    AResponseInfo.ContentType := 'text/html';
    AResponseInfo.ContentText := '<html>Authorization required</html>';
    AResponseInfo.CustomHeaders.Values['WWW-Authenticate'] := 'Basic ...your values here ...';
    AResponseInfo.AuthRealm := 'Welcome to Synaptica OnAirController';
    Exit;
    end;
  End;

username と password を入力するために使用する 2 つの Tedit があるフォームにコンポーネント TIdHttpServer を挿入すると、これに気付きました。明らかに、この小さなことは実稼働システムには正しくありませんが、例です。

于 2015-11-02T20:46:54.467 に答える