diff --git a/ServiceSamples/AuthenticationUtility/OAuthHelper.cs b/ServiceSamples/AuthenticationUtility/OAuthHelper.cs index 0be61a5..f1c99d1 100644 --- a/ServiceSamples/AuthenticationUtility/OAuthHelper.cs +++ b/ServiceSamples/AuthenticationUtility/OAuthHelper.cs @@ -14,6 +14,70 @@ public class OAuthHelper /// public const string OAuthHeader = "Authorization"; + /// + /// Retrieves an authentication header from the service. + /// + /// The authentication header for the Web API call. + public static string GetAuthenticationHeader(Func callBackSetExpirationToken, bool useWebAppAuthentication = false) + { + string aadTenant = ClientConfiguration.Default.ActiveDirectoryTenant; + string aadClientAppId = ClientConfiguration.Default.ActiveDirectoryClientAppId; + string aadClientAppSecret = ClientConfiguration.Default.ActiveDirectoryClientAppSecret; + string aadResource = ClientConfiguration.Default.ActiveDirectoryResource; + + AuthenticationContext authenticationContext = new AuthenticationContext(aadTenant, false); + AuthenticationResult authenticationResult; + + if (useWebAppAuthentication) + { + if (string.IsNullOrEmpty(aadClientAppSecret)) + { + Console.WriteLine("Please fill AAD application secret in ClientConfiguration if you choose authentication by the application."); + throw new Exception("Failed OAuth by empty application secret."); + } + + try + { + // OAuth through application by application id and application secret. + var creadential = new ClientCredential(aadClientAppId, aadClientAppSecret); + authenticationResult = authenticationContext.AcquireTokenAsync(aadResource, creadential).Result; + } + catch (Exception ex) + { + Console.WriteLine(string.Format("Failed to authenticate with AAD by application with exception {0} and the stack trace {1}", ex.ToString(), ex.StackTrace)); + throw new Exception("Failed to authenticate with AAD by application."); + } + } + else + { + // OAuth through username and password. + string username = ClientConfiguration.Default.UserName; + string password = ClientConfiguration.Default.Password; + + if (string.IsNullOrEmpty(password)) + { + Console.WriteLine("Please fill user password in ClientConfiguration if you choose authentication by the credential."); + throw new Exception("Failed OAuth by empty password."); + } + + try + { + // Get token object + var userCredential = new UserPasswordCredential(username, password); ; + authenticationResult = authenticationContext.AcquireTokenAsync(aadResource, aadClientAppId, userCredential).Result; + } + catch (Exception ex) + { + Console.WriteLine(string.Format("Failed to authenticate with AAD by the credential with exception {0} and the stack trace {1}", ex.ToString(), ex.StackTrace)); + throw new Exception("Failed to authenticate with AAD by the credential."); + } + } + + callBackSetExpirationToken(authenticationResult.ExpiresOn.UtcDateTime); + // Create and get JWT token + return authenticationResult.CreateAuthorizationHeader(); + } + /// /// Retrieves an authentication header from the service. /// diff --git a/ServiceSamples/ODataConsoleApplication/Program.cs b/ServiceSamples/ODataConsoleApplication/Program.cs index 8bd9bcd..a7dfe01 100644 --- a/ServiceSamples/ODataConsoleApplication/Program.cs +++ b/ServiceSamples/ODataConsoleApplication/Program.cs @@ -2,7 +2,6 @@ using Microsoft.OData.Client; using ODataUtility.Microsoft.Dynamics.DataEntities; using System; -using System.Linq; namespace ODataConsoleApplication { @@ -17,12 +16,15 @@ static void Main(string[] args) Uri oDataUri = new Uri(ODataEntityPath, UriKind.Absolute); var context = new Resources(oDataUri); - + DateTimeOffset _expirationToken = DateTime.UtcNow; + var authenticationHeader = ""; context.SendingRequest2 += new EventHandler(delegate (object sender, SendingRequest2EventArgs e) - { - var authenticationHeader = OAuthHelper.GetAuthenticationHeader(useWebAppAuthentication: true); - e.RequestMessage.SetHeader(OAuthHelper.OAuthHeader, authenticationHeader); - }); + { + + if (!IsValidToken()) //Auto refresh token + authenticationHeader = OAuthHelper.GetAuthenticationHeader(SetTokenExpirationDateTime, useWebAppAuthentication: true); + e.RequestMessage.SetHeader(OAuthHelper.OAuthHeader, authenticationHeader); + }); // Uncomment below to run specific examples @@ -36,7 +38,7 @@ static void Main(string[] args) // QueryExamples.SortSyntax(context); // QueryExamples.FilterByCompany(context); // QueryExamples.ExpandNavigationalProperty(context); - + // 2. Simple CRUD examples @@ -48,8 +50,19 @@ static void Main(string[] args) // ODataChangesetsExample.CreateSalesOrderWithoutChangeset(context); Console.ReadLine(); - } - + DateTimeOffset SetTokenExpirationDateTime(DateTimeOffset datahoraexpiracao) + { + _expirationToken = datahoraexpiracao; + + return datahoraexpiracao; + } + + bool IsValidToken() + { + return _expirationToken > DateTime.UtcNow; + } + + } } }