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