Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Prevent dialog (Basic Authentication prompt) during call of Webservice

In a delphi program (running as a service) i need to call some webservices.
The calls works fine if basic Authentications is not requerired. The calls also works fine if Basic Authentication is requerired and username/password is provided (in BeforePost) using:

InternetSetOption(Data, INTERNET_OPTION_USERNAME,...
InternetSetOption(Data, INTERNET_OPTION_PASSWORD,...

But if Basic Authentication is Requeried, and username/password is not provided, the program brings up af prompt for the username/password (thats a NO-GO in a servcice).

So how can I signal that i DON'T want a prompt, but instead an error?

The problem is, as i can se it, in the SOAPHTTPTrans function THTTPReqResp.Send(const ASrc: TStream): Integer; (line 762 (second call to InternetErrorDlg i that method)).

EDIT1:
if i change the Flags in the beginning of the send method (in SOAPHTTPTRANS) to include INTERNET_FLAG_NO_AUTH, it works as i wanted.
But how do i do that without changing the SAOPHTTPTrans (if possible)?

EDIT2:

ws := THTTPRIO.Create(Self);
ws.URL := 'http://excample.com/ws.asmx';
ws.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts];
ws.HTTPWebNode.OnBeforePost := WebServiceCallBeforePost;
AvailabilityWebservice := (ws as AvailabilityServiceSoap);
sTemp := AvailabilityWebservice.GetVersion;

Where AvailabilityServiceSoap is the interface generated using the WSDL importer.

like image 655
BennyBechDk Avatar asked Feb 18 '10 08:02

BennyBechDk


People also ask

Why is the dialog box prompt for credentials not working in edge?

Re: Windows Integrated Authentication - Dialog box prompt for credentials is the wrong one! Good news @Keith Davis , this is due to "Allow Windows Credentials for HTTP Authentication Challenges" and if you disable it in Edge settings, it will revert to the previous login dialog.

Can I use basic AUTH for business central web service authentication?

With Business Central online, the use of access keys (Basic Auth) for web service authentication is deprecated. We recommend that you use OAuth2 instead. For more information, see Using OAuth to Authorize Business Central Web Services. About NavUserPassword and AccessControlService credential types

Is there a way to prevent login prompt after WWW-Authenticate?

As far as I know (feel free to correct me if I'm wrong), there is no way to prevent the login prompt once the browser receives the WWW-Authenticate header.

How do I authenticate a user to a web service?

To access a web service, users must provide valid credentials for the credential type being used. If Business Central is configured for Windows credential type, then users are automatically authenticated against the Windows account that their computer is running under, and they are not prompted for their credentials.


2 Answers

I had this problem when trying to let Windows Live Messenger work through a web filter.

I ended up writing a small program that auto-authenticates every so often.

Hope this helps you too.

uses
  ... IdHTTP ...;

...
var
  httpGetter: TIdHTTP;
...    
httpGetter.Request.Username := username;
httpGetter.Request.Password := password;
httpGetter.HandleRedirects := True;
httpGetter.Request.BasicAuthentication := True;

//custom useragent required to let live messenger work
//this part is probably not necessary for your situation
httpGetter.Request.UserAgent := 'MSN Explorer/9.0 (MSN 8.0; TmstmpExt)';

httpGetter.Get(url,MS);
...
like image 111
JosephStyons Avatar answered Nov 15 '22 07:11

JosephStyons


You could create a new class which Inherits from THTTPReqResp and override the send method so that you can include your own flags. You should be able to set ws.HTTPWebNode to a new node using the new class.

Something Like

ws := THTTPRIO.Create(Self);
MyNewNode := MyNewClass.Create;
ws.HTTPWebNode := MyNewNode;
ws.URL := 'http://excample.com/ws.asmx';
ws.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts];
ws.HTTPWebNode.OnBeforePost := WebServiceCallBeforePost;
AvailabilityWebservice := (ws as AvailabilityServiceSoap);
sTemp := AvailabilityWebservice.GetVersion;
like image 31
James Barrass Avatar answered Nov 15 '22 07:11

James Barrass