Nachdem ich einige mehr Stochern sehen können, fand ich schließlich heraus, wie dies zu tun. Meine Erklärung hier wird im Zusammenhang mit dem Beispielprogramm stehen, das in der ursprünglichen Frage erwähnt wurde.
Im Programm im SignIn
Verfahren gab es einige Setup die OneDriveClient.GetMicrosoftAccountClient(...)
enthalten getan Aufruf, dann wird die folgende Aufruf:
if (!this.oneDriveClient.IsAuthenticated)
{
await this.oneDriveClient.AuthenticateAsync();
}
benötigt also zwei Dinge getan werden. Wir müssen das Ergebnis aus dem obigen Code speichern und dann den RefreshToken-Wert an einem sicheren Ort speichern ... (Es ist nur ein sehr langer String).
if (!this.oneDriveClient.IsAuthenticated)
{
AccountSession accountSession = await this.oneDriveClient.AuthenticateAsync();
// Save accountSession.RefreshToken somewhere safe...
}
Schließlich brauchte ich ein if
um den OneDriveClient.GetMicrosoftAccountClient(...)
Anruf zu setzen und es nur nennen, wenn die gespeicherte Aktualisierungs-Token noch nicht gespeichert worden ist (oder als gelöscht aufgrund Code zum Logout Anruf hinzugefügt ...) Wenn wir ein gespeichertes Aktualisierungstoken haben, rufen wir stattdessen `OneDriveClient.GetSilentlyAuthenticatedMicrosoftAccountClient (...) auf. Die gesamte SignIn-Methode sieht so aus, wenn ich fertig bin.
private async Task SignIn(ClientType clientType)
{
string refreshToken = null;
AccountSession accountSession;
// NOT the best place to save this, but will do for an example...
refreshToken = Properties.Settings.Default.RefreshToken;
if (this.oneDriveClient == null)
{
if (string.IsNullOrEmpty(refreshToken))
{
this.oneDriveClient = clientType == ClientType.Consumer
? OneDriveClient.GetMicrosoftAccountClient(
FormBrowser.MsaClientId,
FormBrowser.MsaReturnUrl,
FormBrowser.Scopes,
webAuthenticationUi: new FormsWebAuthenticationUi())
: BusinessClientExtensions.GetActiveDirectoryClient(FormBrowser.AadClientId, FormBrowser.AadReturnUrl);
}
else
{
this.oneDriveClient = await OneDriveClient.GetSilentlyAuthenticatedMicrosoftAccountClient(FormBrowser.MsaClientId,
FormBrowser.MsaReturnUrl,
FormBrowser.Scopes,
refreshToken);
}
}
try
{
if (!this.oneDriveClient.IsAuthenticated)
{
accountSession = await this.oneDriveClient.AuthenticateAsync();
// NOT the best place to save this, but will do for an example...
Properties.Settings.Default.RefreshToken = accountSession.RefreshToken;
Properties.Settings.Default.Save();
}
await LoadFolderFromPath();
UpdateConnectedStateUx(true);
}
catch (OneDriveException exception)
{
// Swallow authentication cancelled exceptions
if (!exception.IsMatch(OneDriveErrorCode.AuthenticationCancelled.ToString()))
{
if (exception.IsMatch(OneDriveErrorCode.AuthenticationFailure.ToString()))
{
MessageBox.Show(
"Authentication failed",
"Authentication failed",
MessageBoxButtons.OK);
var httpProvider = this.oneDriveClient.HttpProvider as HttpProvider;
httpProvider.Dispose();
this.oneDriveClient = null;
}
else
{
PresentOneDriveException(exception);
}
}
}
}
Für Vollständigkeit, ich den Logout-Code aktualisiert
private async void signOutToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.oneDriveClient != null)
{
await this.oneDriveClient.SignOutAsync();
((OneDriveClient)this.oneDriveClient).Dispose();
this.oneDriveClient = null;
// NOT the best place to save this, but will do for an example...
Properties.Settings.Default.RefreshToken = null;
Properties.Settings.Default.Save();
}
UpdateConnectedStateUx(false);
}
OK, aber dieser Rahmen ist schon da ... 'private static Nur-Lese-string [] Scopes = { "onedrive.readwrite",„wl .offline_access "," wl.signin "};'. Außerdem verwende ich das C# SDK und nicht die https-Schnittstelle direkt, also bin ich unsicher, wie ich diese Dokumentation in das C# API-Framework übersetzen kann. – Jim
Können Sie die Details/den Code angeben, wie Sie die Einrichtung des OneDrive-Clients und die Konfiguration des Authentifizierungsanrufs erstellen? –
Sicher, ich verwende nur den Beispielcode für die API. Ich habe mein OP mit Details, wo es gefunden werden kann, bearbeitet.An diesem Punkt ist es nur "Lagercode" ohne Änderungen ... – Jim