teisipäev, 27. detsember 2022

OAuth2 tokeni lisamine WSDL veebipäringule

Alustuseks nii, et kui on tehtud WSDL-iga Dynamics veebiteenusest mingi valmis klass selle teenuse kasutamiseks, siis vaikimis on see klass ilma OAuth2 toeta.

OAuth2 jaoks vaja, et saaks päringule Bearer tokeni lisada

Asja päästab see, et need Dynamics klassid pärinevad SoapHttpClientProtocol, ehk seal tuleb GetWebRequest üle kirjutada, lisada juurde ka public string muutuja selle OAuth2 tokeni lisamiseks

Ehk seda WSDL-iga genereeritud klassi tuleb natuke muuta lisa

public string token = "";  //siin hakkad OAuth2 tokenit hoidma

ja kirjuta GetWebRequest üle

protected override WebRequest GetWebRequest(Uri uri)
        {

            WebRequest req = base.GetWebRequest(uri);
            req.Headers.Add("Authorization", "Bearer " + this.token);
            return req;
        }

Kasutamiseks tuleb lihtsalt enne päringu tegemist token klassile sisse anda

TYK_CustomerLedgerEntries_Service klass on WSDL-iga genereeritud, mida just muutsime

Lood teenuse klassi

TYK_CustomerLedgerEntries_Service tes = new TYK_CustomerLedgerEntries_Service();

ja omistad tokeni

tes.token = getAccessToken();

ja siis teed päringu

 

OAuth2 tokeni saamiseks on mitu võimalust.Kui on kasutada clientId, TenantId ja ClientSecret saab seda teha nii

        private static string getAccessToken()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            TokeniKysimine lr = new TokeniKysimine();

            Task<AuthenticationResult> resultThing = Task.Run<AuthenticationResult>(async () => await new TokeniKysimine().KysiTokenit());

            resultThing.Wait();
            AuthenticationResult result = resultThing.Result;
            return resultThing.Result.AccessToken;
        }

 

Klass, mis tokenit küsib

 

    public class TokeniKysimine
    {
        public async Task<AuthenticationResult> KysiTokenit()
        {

            string tenantId = System.Configuration.ConfigurationManager.AppSettings["DynamicsTenantId"];
            string clientId = System.Configuration.ConfigurationManager.AppSettings["DynamicsClientId"];
            string clientSecret = System.Configuration.ConfigurationManager.AppSettings["DynamicsClientSecret"];

            string[] scopes = new string[] { "https://api.businesscentral.dynamics.com/.default" };

            IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(clientId)            .WithClientSecret(clientSecret) 
           .WithAuthority(new Uri(@"https://login.microsoftonline.com/" + tenantId + @"/v2.0/oauth2/token"))
           .Build();
            AuthenticationResult result = null;
            try
            {
                result = await app.AcquireTokenForClient(scopes)
                                 .ExecuteAsync();
            }
            catch (MsalUiRequiredException ex)
            {
                Console.WriteLine(ex.Message);
                throw ex;
            }
            catch (MsalServiceException ex) //when (ex.Message.Contains("AADSTS70011"))
            {
                Console.WriteLine(ex.Message);
                throw ex;
            }
            return result;
        }
    }