Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor PnPConnection to streamline authentication flow and improve token acquisition process #4634

Merged
merged 1 commit into from
Dec 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 34 additions & 59 deletions src/Commands/Base/PnPConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -467,78 +467,53 @@ internal static PnPConnection CreateWithCredentials(Cmdlet cmdlet, Uri url, PSCr
var context = new PnPClientContext(url.AbsoluteUri)
{
ApplicationName = Resources.ApplicationName,
DisableReturnValueCache = true
DisableReturnValueCache = true,
};
PnPConnection spoConnection = null;
if (!onPrem)
{
var tenantId = string.Empty;
try
{
spoConnection = new PnPConnection(context, ConnectionType.O365, credentials, url.ToString(), tenantAdminUrl, PnPPSVersionTag, initializationType);

spoConnection.ConnectionMethod = ConnectionMethod.Credentials;
spoConnection.AzureEnvironment = azureEnvironment;
spoConnection.Tenant = tenantId;
spoConnection.ClientId = clientId;

if (!string.IsNullOrWhiteSpace(clientId))
PnP.Framework.AuthenticationManager authManager = null;
if (CachedAuthenticationManager != null)
{
PnP.Framework.AuthenticationManager authManager = null;
if (PnPConnection.CachedAuthenticationManager != null)
{
authManager = PnPConnection.CachedAuthenticationManager;
PnPConnection.CachedAuthenticationManager = null;
}
else
{
authManager = PnP.Framework.AuthenticationManager.CreateWithCredentials(clientId, credentials.UserName, credentials.Password, redirectUrl, azureEnvironment, tokenCacheCallback: async (tokenCache) =>
{
await MSALCacheHelper(tokenCache, url.ToString(), clientId);
});
}
using (authManager)
{
context = PnPClientContext.ConvertFrom(authManager.GetContext(url.ToString()));
context.ExecutingWebRequest += (sender, e) =>
{
e.WebRequestExecutor.WebRequest.UserAgent = $"NONISV|SharePointPnP|PnPPS/{((AssemblyFileVersionAttribute)Assembly.GetExecutingAssembly().GetCustomAttribute(typeof(AssemblyFileVersionAttribute))).Version} ({System.Environment.OSVersion.VersionString})";
};
context.ExecuteQueryRetry();
Log.Debug("PnPConnection","Acquiring token");
var accesstoken = authManager.GetAccessTokenAsync(url.ToString()).GetAwaiter().GetResult();
Log.Debug("PnPConnection","Token acquired");
var parsedToken = new Microsoft.IdentityModel.JsonWebTokens.JsonWebToken(accesstoken);
tenantId = parsedToken.Claims.FirstOrDefault(c => c.Type == "tid").Value;
spoConnection.AuthenticationManager = authManager;
}
authManager = CachedAuthenticationManager;
CachedAuthenticationManager = null;
}
else
{
PnP.Framework.AuthenticationManager authManager = null;
if (PnPConnection.CachedAuthenticationManager != null)
authManager = PnP.Framework.AuthenticationManager.CreateWithCredentials(clientId, credentials.UserName, credentials.Password, redirectUrl, azureEnvironment, tokenCacheCallback: async (tokenCache) =>
{
authManager = PnPConnection.CachedAuthenticationManager;
}
else
{
authManager = PnP.Framework.AuthenticationManager.CreateWithCredentials(clientId, credentials.UserName, credentials.Password, azureEnvironment: azureEnvironment);
}
using (authManager)
await MSALCacheHelper(tokenCache, url.ToString(), clientId);
});
}
using (authManager)
{
var clientContext = authManager.GetContext(url.ToString());
context = PnPClientContext.ConvertFrom(clientContext);

context.ExecutingWebRequest += (sender, e) =>
{
context = PnPClientContext.ConvertFrom(authManager.GetContext(url.ToString()));
context.ExecutingWebRequest += (sender, e) =>
{
e.WebRequestExecutor.WebRequest.UserAgent = $"NONISV|SharePointPnP|PnPPS/{((AssemblyFileVersionAttribute)Assembly.GetExecutingAssembly().GetCustomAttribute(typeof(AssemblyFileVersionAttribute))).Version} ({System.Environment.OSVersion.VersionString})";
};
context.ExecuteQueryRetry();

var accessToken = authManager.GetAccessTokenAsync(url.ToString()).GetAwaiter().GetResult();
var parsedToken = new Microsoft.IdentityModel.JsonWebTokens.JsonWebToken(accessToken);
tenantId = parsedToken.Claims.FirstOrDefault(c => c.Type == "tid").Value;
spoConnection.AuthenticationManager = authManager;
}
e.WebRequestExecutor.WebRequest.UserAgent = $"NONISV|SharePointPnP|PnPPS/{((AssemblyFileVersionAttribute)Assembly.GetExecutingAssembly().GetCustomAttribute(typeof(AssemblyFileVersionAttribute))).Version} ({System.Environment.OSVersion.VersionString})";
};
context.ExecuteQueryRetry();
Log.Debug("PnPConnection", "Acquiring token");
var accesstoken = authManager.GetAccessTokenAsync(url.ToString()).GetAwaiter().GetResult();
Log.Debug("PnPConnection", "Token acquired");
var parsedToken = new Microsoft.IdentityModel.JsonWebTokens.JsonWebToken(accesstoken);
tenantId = parsedToken.Claims.FirstOrDefault(c => c.Type == "tid").Value;

spoConnection = new PnPConnection(context, ConnectionType.O365, credentials, url.ToString(), tenantAdminUrl, PnPPSVersionTag, initializationType);

spoConnection.ConnectionMethod = ConnectionMethod.Credentials;
spoConnection.AzureEnvironment = azureEnvironment;
spoConnection.Tenant = tenantId;
spoConnection.ClientId = clientId;

spoConnection.AuthenticationManager = authManager;
}

}
catch (ClientRequestException)
{
Expand Down Expand Up @@ -1032,7 +1007,7 @@ private static async Task MSALCacheHelper(ITokenCache tokenCache, string url, st
}
catch (MsalCachePersistenceException)
{
PnP.Framework.Diagnostics.Log.Debug("PnPConnection","Cache persistence failed. Trying again.");
PnP.Framework.Diagnostics.Log.Debug("PnPConnection", "Cache persistence failed. Trying again.");
var storage =
new StorageCreationPropertiesBuilder("pnp.msal.cache", cacheDir)
.WithMacKeyChain(
Expand Down
Loading