2016-05-19 12 views
1

Ich erstelle ein Intranet auf SharePoint - O365, wo ich ein Widget, wo ich Kalenderereignisse abrufen und für eine Woche anzeigen kann. Hier ist ein Schritt zu Fuß:OAuth2 und Access Token in SharePoint App

a. Benutzeranmeldung im Intranet b. Zugriffstoken wird generiert, um auf die Office 365-REST-API zuzugreifen c. Kalenderereignisse werden abgerufen und angezeigt.

Hier ist mein Problem:

Ich dachte an zwei Optionen, um eine Zugriffstoken

Option zu erzeugen: eine WCF-Anwendung erstellen, den Benutzerkontext accpets und das Token generieren. Dies wird die Ergebnisse abrufen und eine Liste aktualisieren. Meine Intranet-App kann eine Kalenderliste lesen und das Widget aktualisieren. Dies funktionierte nicht, da ich den Benutzerkontext nicht von der SP zur WCF-Methode übergeben konnte, so dass das Zugriffstoken generiert werden konnte.

Option b: Verwenden Sie den folgenden Code (den ich ab sofort gemacht habe), aber es zeigt das Zugriffstoken in URL an, das für den Client nicht gut ist.

var clientId = '>> Beispiel >>';

var replyUrl = '<<>>'; 
var endpointUrl = 'https://outlook.office365.com/api/v1.0/me/events'; 
var resource = "https://outlook.office365.com/"; 

var authServer = 'https://login.windows.net/common/oauth2/authorize?'; 
var responseType = 'token'; 


var url = authServer + 
     "response_type=" + encodeURI(responseType) + "&" + 
     "client_id=" + encodeURI(clientId) + "&" + 
     "resource=" + encodeURI(resource) + "&" + 
     "redirect_uri=" + encodeURI(replyUrl); 

window.location = url;

Gibt es einen anderen Weg, dies zu erreichen?

Ankush

Antwort

0

Da Sie erwähnt, dass Sie die WCF verwenden möchten, entwickeln Sie einen Host bereitgestellt Sharepoint-App?

Wenn ich richtig verstehe, können wir den expliziten Berechtigungscode-Grant Flow verwenden, der das Zugriffs-Token nicht dem Benutzeragenten aussetzt. Das folgende Diagramm zeigt den Autorisierungscode Grant-Flow: enter image description here

Und hier ist der Kern-Code das Zugriffstoken für die Office 365-Ressource für Sie abrufen Referenz:

var signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
     var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 

     AuthenticationContext authContext = new AuthenticationContext(SettingsHelper.Authority, new ADALTokenCache(signInUserId)); 

     try 
     { 
      DiscoveryClient discClient = new DiscoveryClient(SettingsHelper.DiscoveryServiceEndpointUri, 
       async() => 
       { 
        var authResult = await authContext.AcquireTokenSilentAsync(SettingsHelper.DiscoveryServiceResourceId, 
                       new ClientCredential(SettingsHelper.ClientId, 
                            SettingsHelper.ClientSecret), 
                       new UserIdentifier(userObjectId, 
                            UserIdentifierType.UniqueId)); 
        string token= authResult.AccessToken; 
        return authResult.AccessToken; 
       }); 

      var dcr = await discClient.DiscoverCapabilityAsync(capabilityName); 

      return new OutlookServicesClient(dcr.ServiceEndpointUri, 
       async() => 
       { 
        var authResult = await authContext.AcquireTokenSilentAsync(dcr.ServiceResourceId, 
                       new ClientCredential(SettingsHelper.ClientId, 
                            SettingsHelper.ClientSecret), 
                       new UserIdentifier(userObjectId, 
                            UserIdentifierType.UniqueId)); 

        return authResult.AccessToken; 
       }); 
     } 

Das vollständige Codebeispiel können Sie verweisen zu here. Und here ist ein hilfreicher Link, der den Unterschied zwischen explizitem und implizitem Authentifizierungsablauf erläutert.

+0

Danke. Nein, grundsätzlich möchte ich dies erreichen, indem ich ein Javascript in die SharePOint-Seite einbettle, die eine WCF-Methode aufrufen kann. –

Verwandte Themen