[Gelöst] Token von Azure holen

30. November 2022 13:06

Hallo zusammen,
ich möchte mittels NAV2017 ein Token von Azure holen. Jedoch funktioniert es nicht. Ich habe zuerst die Funktionen aus CU 1297 benutzt, jedoch ohne Erfolg. Also habe ich den Aufruf vereinfacht in C# umgesetzt und danach diesen in C/Al übertragen. In C# funktioniert der Aufruf. Aktuell stehe ich aber etwas auf dem Schlauch. Hat jemand eine Idee, woran es liegen könnte das es in NAV nicht funktioniert?

C/Al Code:

Code:
[TryFunction]
    LOCAL PROCEDURE GetAuthToken2@1000000130();
    VAR
      URL@1000000000 : Text;
      RequestBody@1000000007 : Text;
      myRequest@1000000014 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.HttpWebRequest";
      RequestStream@1000000016 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.Stream";
      AuthStreamWriter@1000000015 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.StreamWriter";
      Encoding@1000000017 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Text.Encoding";
      myResponse@1000000018 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.HttpWebResponse";
    BEGIN
      URL := 'https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxxxxx/oauth2/token';
      myRequest := myRequest.Create(URL);
      myRequest.Method := 'POST';
      myRequest.ContentType := 'application/x-www-form-urlencoded';
      myRequest.Timeout := 30000;
      RequestStream := myRequest.GetRequestStream();
      RequestBody := 'client_id=xxxxxxxxxxxxxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxx&grant_type=client_credentials&redirect_uri=https%3A%2F%2Flocalhost&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default';
      AuthStreamWriter := AuthStreamWriter.StreamWriter(RequestStream,Encoding.UTF8);
      AuthStreamWriter.Write(RequestBody);
      AuthStreamWriter.Flush;
      AuthStreamWriter.Close;
      AuthStreamWriter.Dispose;
      myResponse := myRequest.GetResponse;
    END;


Fehler bei "myResponse := myRequest.GetResponse;":
Microsoft Dynamics NAV
---------------------------

Unterbrechen bei Fehlermeldung:

Fehler bei einem Aufruf von System.Net.HttpWebRequest.GetResponse mit folgender Meldung: Der Remoteserver hat einen Fehler zurückgegeben: (400) Ungültige Anforderung.
---------------------------
OK
---------------------------

C# Code der das gewünschte Ergebnis erzielt :wink: :

Code:
   public string GetAuthTokenResponse()
        {
            string URL = "https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxxxxx/oauth2/token";
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL);
            myRequest.Method = "POST";
            myRequest.ContentType = "application/x-www-form-urlencoded";
            myRequest.Timeout = 30000;
            Stream RequestStream = myRequest.GetRequestStream();
            string RequestBody = "client_id=xxxxxxxxxxxxxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxx&grant_type=client_credentials&redirect_uri=https%3A%2F%2Flocalhost&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default";
           
            StreamWriter AuthStreamWriter = new StreamWriter(RequestStream, Encoding.UTF8);
            AuthStreamWriter.Write(RequestBody);
            AuthStreamWriter.Flush();
            AuthStreamWriter.Close();
            AuthStreamWriter.Dispose();

            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            Stream myResponseStream = myResponse.GetResponseStream();
            StreamReader myReader = new StreamReader(myResponseStream, Encoding.UTF8);
            return myReader.ReadToEnd();
        }


Ich freu mich auf das Feedback. :-D
Zuletzt geändert von BastianB am 24. Januar 2023 13:17, insgesamt 1-mal geändert.

Re: Token von Azure holen

30. November 2022 18:23

die Frage wäre, was bei Codeunit 1297 nicht funktioniert hat.
Egal erstmal - schau dir mal https://dynamics.is/?p=2637 an

Re: Token von Azure holen

1. Dezember 2022 11:28

Mein erster Versuch:
Code:
    [TryFunction]
    LOCAL PROCEDURE GetAuthTokenResponse@1000000124(URL@1000000007 : Text;ClientID@1000000004 : Text;ClientSecret@1000000005 : Text;Resource@1000000006 : Text;VAR ResponseValue@1000000011 : Text);
    VAR
      ResponseInStream@1000000000 : InStream;
      Request@1000000002 : Text;
      TypeHelper@1000000003 : Codeunit 10;
      HttpWebRequestMgt@1000000008 : Codeunit 1297;
      HttpStatusCode@1000000010 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.HttpStatusCode";
      HttpResponseHeaders@1000000009 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Collections.Specialized.NameValueCollection";
    BEGIN
      HttpWebRequestMgt.Initialize(URL);
      HttpWebRequestMgt.SetMethod('POST');
      HttpWebRequestMgt.SetContentType('application/x-www-form-urlencoded');
      HttpWebRequestMgt.CreateInstream(ResponseInStream);

      Request :=
        'grant_type=client_credentials&' +
        'client_id=' + TypeHelper.UrlEncode(ClientID) + '&' +
        'client_secret=' + TypeHelper.UrlEncode(ClientSecret) + '&' +
        'resource=' + TypeHelper.UrlEncode(Resource);

      HttpWebRequestMgt.AddBodyAsText(Request);
      HttpWebRequestMgt.DisableUI;
      HttpWebRequestMgt.SetTraceLogEnabled(TRUE);

      IF NOT HttpWebRequestMgt.GetResponse(ResponseInStream,HttpStatusCode,HttpResponseHeaders) THEN
        HttpWebRequestMgt.ProcessFaultResponse('');

      ResponseInStream.READTEXT(ResponseValue);
    END;


Fehler ist tritt ebenfalls bei der Response auf, bei "HttpWebResponse := HttpWebRequest.GetResponse; ":

Code:
[TryFunction] GetWebResponse(VAR HttpWebRequest : DotNet "System.Net.HttpWebRequest";VAR HttpWebResponse : DotNet "System.Net.HttpWebResponse";VAR ResponseInStream : InStream;VAR HttpStatusCode : DotNet "System.Net.HttpStatusCode";VAR ResponseHeaders
IF ProgressDialogEnabled THEN
  ProcessingWindow.OPEN(ProcessingWindowMsg);

CLEARLASTERROR;
HttpWebResponse := HttpWebRequest.GetResponse;
HttpWebResponse.GetResponseStream.CopyTo(ResponseInStream);
HttpStatusCode := HttpWebResponse.StatusCode;
ResponseHeaders := HttpWebResponse.Headers;

IF ProgressDialogEnabled THEN
  ProcessingWindow.CLOSE;



Danke, für den Blogbeitrag, den hatte ich mir auch schon angesehen. :mrgreen:

Re: Token von Azure holen

24. Januar 2023 13:17

Ich habe jetzt zwei neue Docker Umgebungen aufgebaut:
NAV2017 CU7 - Code funktioniert nicht
NAV2017 CU61 - Code funktioniert

Code:
LOCAL [TryFunction] GetAuthTokenResponse2(URL : Text;ClientID : Text;ClientSecret : Text;Resource : Text;VAR ResponseValue : Text)
HttpWebRequestMgt.Initialize(URL);
HttpWebRequestMgt.SetMethod('POST');
HttpWebRequestMgt.SetContentType('application/x-www-form-urlencoded');
HttpWebRequestMgt.SetReturnType('application/json');
HttpWebRequestMgt.AddHeader('Authorization', 'Bearer');
HttpWebRequestMgt.AddHeader('cache-control','no-cache');
HttpWebRequestMgt.CreateInstream(ResponseInStream);

Request :=
  'grant_type=client_credentials&' +
  'client_id=' + TypeHelper.UrlEncode(ClientID) + '&' +
  'client_secret=' + TypeHelper.UrlEncode(ClientSecret) + '&' +
  'resource=' + TypeHelper.UrlEncode(Resource);

HttpWebRequestMgt.AddBodyAsText(Request);
HttpWebRequestMgt.DisableUI;
HttpWebRequestMgt.SetTraceLogEnabled(TRUE);

IF NOT HttpWebRequestMgt.GetResponse(ResponseInStream,HttpStatusCode,HttpResponseHeaders) THEN
  HttpWebRequestMgt.ProcessFaultResponse('');

ResponseInStream.READTEXT(ResponseValue);

Re: [Gelöst] Token von Azure holen

24. Januar 2023 13:29

super, danke für's Teilen der Lösung!!!! Das obwohl der Beitrag schon ein paar Tage älter ist!

Re: Token von Azure holen

24. Januar 2023 13:45

BastianB hat geschrieben:NAV2017 CU7 - Code funktioniert nicht
NAV2017 CU61 - Code funktioniert

Da NAV 2017 erst ab CU 18 TLS 1.2 unterstützt sollte man CU 7 auch nicht mehr betreiben :wink: .
Enable support for TLS 1.2 in your environment for Azure AD TLS 1.1 and 1.0 deprecation
Siehe auch hier.

Re: [Gelöst] Token von Azure holen

13. April 2023 10:13

Danke Kowa für die Erinnerung. Habe jetzt ein technisches Update auf CU61 durchgeführt. 8-)