2016-04-21 8 views
1

Ich habe gerade angefangen, mit der OneDrive API und dem mitgelieferten Beispielprogramm (OneDriveApiBrowser) zu arbeiten.Wie melde ich mich bei OneDrive an (nach der Anfangszeit), ohne den Berechtigungsbildschirm zu sehen

Wie erwartet, als ich mich das erste Mal anmeldete (mit "Anmelden bei MSA ..."), wurde ich nach Zugangsdaten, meinem 2-Faktor-Code und schließlich einem Berechtigungsbildschirm gefragt, ob ich den Zugang genehmige Die App möchte gegen mein OneDrive-Konto.

Aber, nachdem ich das Programm beenden und neu starten, bin ich nicht eingeloggt. Ich wiederhole "Anmelden bei MSA ..." und ich bin nicht mehr aufgefordert, Anmeldeinformationen (wie ich erwartet hatte), aber ich am aufgefordert, mit dem Berechtigungsbildschirm wieder.

gibt es eine Möglichkeit, die App Protokoll mit zurück in ohne immer prompti den Benutzer um Erlaubnis bitten?

Zum Erlernen der Verwendung der OneDrive-API verwende ich nur den Beispielcode, den Microsoft als Teil der API unter https://github.com/OneDrive/onedrive-sdk-csharp/tree/master/samples/OneDriveApiBrowser bereitgestellt hat. Der Code kann nicht direkt von dort heruntergeladen werden, sondern im Stammverzeichnis dieses Projekts, https://github.com/OneDrive/onedrive-sdk-csharp. Dadurch werden die Quelle für die API sowie der Beispielcode und die Komponententests heruntergeladen.

Antwort

2

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

Der Bereich wl.offline_access wird von Anwendungen benötigt, um die Benutzerzustimmungsinformationen zu speichern und das Zugriffstoken ohne Eingabeaufforderung der Benutzeroberfläche zu aktualisieren.

Weitere Informationen zu den Bereichen, die Sie in Ihrer Anwendung https://dev.onedrive.com/auth/msa_oauth.htm#authentication-scopes

+0

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

+0

Können Sie die Details/den Code angeben, wie Sie die Einrichtung des OneDrive-Clients und die Konfiguration des Authentifizierungsanrufs erstellen? –

+0

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

Verwandte Themen