[Gelöst] Token von Azure holen

Bild Microsoft Dynamics NAV 2017

[Gelöst] Token von Azure holen

Beitragvon BastianB » 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: Alles auswählen
[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: Alles auswählen
   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.
BastianB
 
Beiträge: 38
Registriert: 30. November 2022 12:19
Wohnort: Glauchau
Realer Name: Bastian Benicke
Arbeitsort: Neuenkirchen
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: ab 2013R2

Re: Token von Azure holen

Beitragvon sweikelt » 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
Benutzeravatar
sweikelt
Microsoft Partner
Microsoft Partner
 
Beiträge: 1776
Registriert: 18. November 2010 10:15
Wohnort: Oschatz
Realer Name: Stephan Weikelt
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 3-2018 | D365BC

Re: Token von Azure holen

Beitragvon BastianB » 1. Dezember 2022 11:28

Mein erster Versuch:
Code: Alles auswählen
    [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: Alles auswählen
[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:
BastianB
 
Beiträge: 38
Registriert: 30. November 2022 12:19
Wohnort: Glauchau
Realer Name: Bastian Benicke
Arbeitsort: Neuenkirchen
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: ab 2013R2

Re: Token von Azure holen

Beitragvon BastianB » 24. Januar 2023 13:17

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

Code: Alles auswählen
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);
BastianB
 
Beiträge: 38
Registriert: 30. November 2022 12:19
Wohnort: Glauchau
Realer Name: Bastian Benicke
Arbeitsort: Neuenkirchen
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: ab 2013R2

Re: [Gelöst] Token von Azure holen

Beitragvon sweikelt » 24. Januar 2023 13:29

super, danke für's Teilen der Lösung!!!! Das obwohl der Beitrag schon ein paar Tage älter ist!
Benutzeravatar
sweikelt
Microsoft Partner
Microsoft Partner
 
Beiträge: 1776
Registriert: 18. November 2010 10:15
Wohnort: Oschatz
Realer Name: Stephan Weikelt
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 3-2018 | D365BC

Re: Token von Azure holen

Beitragvon Kowa » 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.
GruĂź, Kai

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, Messenger oder Telefon! DafĂĽr ist dieses Forum da.

Download: Dynamics NAV Object Text Explorer (Alternativlink). MVP Alumni
Benutzeravatar
Kowa
Moderator
Moderator
 
Beiträge: 7835
Registriert: 17. Juni 2005 17:32
Wohnort: Bremen
Realer Name: Kai Kowalewski
Arbeitsort: Osterholz-Scharmbeck
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics 365
Microsoft Dynamics Version: BC, NAV 2018 bis Navision 2.01

Re: [Gelöst] Token von Azure holen

Beitragvon BastianB » 13. April 2023 10:13

Danke Kowa fĂĽr die Erinnerung. Habe jetzt ein technisches Update auf CU61 durchgefĂĽhrt. 8-)
BastianB
 
Beiträge: 38
Registriert: 30. November 2022 12:19
Wohnort: Glauchau
Realer Name: Bastian Benicke
Arbeitsort: Neuenkirchen
Bezug zu Microsoft Dynamics: End-Anwender
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: ab 2013R2


ZurĂĽck zu NAV 2017

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast