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;
}
}