Authentication Delphi XE2 idHttpServer基本身份验证

Authentication Delphi XE2 idHttpServer基本身份验证,authentication,http-headers,delphi-xe2,indy10,Authentication,Http Headers,Delphi Xe2,Indy10,我有一个工作正常的idHttpServer服务器,我设置了如下基本身份验证: procedure TfrmMain.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); Var Cmd : String; Retorno : string; begin

我有一个工作正常的idHttpServer服务器,我设置了如下基本身份验证:

procedure TfrmMain.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
Var
     Cmd           : String;
     Retorno       : string;
begin
     Cmd := ARequestInfo.RawHTTPCommand;

     if  Not ((ARequestInfo.AuthUsername = 'user') and
              (ARequestInfo.AuthPassword = 'pass'))
     Then Begin
         AResponseInfo.AuthRealm := 'Forneça autenticação';
         AResponseInfo.WriteContent;
         Exit;
     End;

     // Do the Work
     // ....
End;
没关系,如果浏览器中的用户没有提供身份验证,浏览器会询问用户和密码,它会正常工作。好的

一旦用户提供了密码并且服务器完成了工作,在下一个请求中,服务器不会返回被拒绝的身份验证以再次请求,因为它认为该身份验证已在上一个请求中提供,即

ARequestInfo.AuthUsername  And ARequestInfo.AuthPassword 
总是在下一个请购单中预先填写,而浏览器不会向用户询问

如果我退出浏览器并再次启动以继续另一个请求,则它将继续,而不要求验证


有没有办法让浏览器总是要求对所有请求进行身份验证?

FYI,您不需要直接调用
WriteContent
,只需
Exit
,让
TIdHTTPServer
为您发送响应。浏览器可以基于URL缓存凭据,并将其重新用于该URL的后续请求。大多数浏览器都提供该功能,用户决定是否启用该功能。强制浏览器重新验证的唯一方法是发送新的
401
回复,但如果这会降低用户体验,则不应这样做
TIdHTTPServer
不缓存
AuthUsername
/
AuthPassword
,它们会在每次请求时重新解析,因此浏览器必须重新发送它们。为什么您关心浏览器是否重新验证每个请求?只要服务器收到正确的凭据,一切正常。如果这不是您想要的,则您必须从基于HTTP的身份验证切换到基于HTML的身份验证,用户必须登录到提交到服务器的HTML webform,然后服务器返回会话cookie,该cookie必须在后续请求中发送回服务器。如果用户注销,则使cookie无效。如果用户关闭浏览器,浏览器将自动销毁cookie。如果对HTML登录页以外的其他内容的请求缺少有效的cookie,请重定向(通过
AresOnSeInfo.redirect()
)到登录页。明白了,我需要它始终进行身份验证,因为多个用户可以使用同一台机器,每个用户都有自己的用户和密码来使用HTTP身份验证,每次成功回复
200
后,您都必须发送
401
回复。这不是很有效率,并且会导致大量来回,消耗网络流量(如果使用HTTPS,则会消耗SSL/TLS开销),而且总体而言,这不是一种良好的用户体验。我会转而使用HTML身份验证。如果新用户需要使用同一台机器,请先让以前的用户注销。然后让一个登录的用户发送他们需要的任意多的请求,而无需多次登录。