3

在 Delphi XE2 / Indy 10 中,我一直在做一些 Web Broker 项目的工作,其中包括一个捕获特定 http 请求的 web 模块,如果没有特定的匹配请求,它会从根目录中搜索文件。现在我要做的是围绕某些文件和文件扩展名实现安全性,就像在典型的 Web 服务器(如 IIS)中一样。

Indy 或至少在 Delphi XE2 中有什么东西可以管理这种安全性吗?还是我必须自己封装的东西?因为我在每个项目中都有不同的方法,我宁愿在所有项目中都有一个标准的方法来做,而不是重新发明轮子。

4

3 回答 3

5

您需要自己进行安全实施。HTTP Server 为您提供要响应的事件,您需要考虑这些事件中的访问权限。

于 2013-05-09T04:15:19.780 回答
5

Indy HTTP Server (TIdHTTPServer) 支持HTTP 基本身份验证,其中包含 Request 对象的属性 AuthExists、AuthUser 和 AuthPass 以及 Response.AuthRealm 属性。(我还没有检查是否也支持 NTLM 或 Digest auth)。

通过在响应中设置 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;

我意识到这是在一个表单上插入一个组件 TIdHttpServer ,我有两个 Tedit 用于输入 username 和 password 。显然,这个小东西对于生产系统是不正确的,但它是一个例子。

于 2015-11-02T20:46:54.467 回答