2016-06-30 6 views
0

Wir haben eine Webanwendung auf ASP.NET in Azure und möchten den aktuellen Benutzer in seinem Kalender anzeigen, um die Ereignisse für heute und die Anzahl der ungelesenen E-Mails anzuzeigen. Wir haben eine Anwendung, die graph.microsoft.com mit der standardmäßigen "Work or School Account" -Authentifizierung verwendet, die mit Visual Studio erstellt wird, aber dies funktioniert nicht mit App Model V2.Verwenden von App Model V2 für den Zugriff auf den Kalender

Wie kann eine Anwendung erstellt werden, die mit App Model V2 authentifiziert werden kann und Zugriff auf graph.microsoft.com erhält?

Antwort

0

Sie müssen Microsoft.IdentityModel.Clients.ActiveDirectory verwenden;

Eine gute Proben gegeben in https://azure.microsoft.com/en-us/documentation/articles/active-directory-appmodel-v2-overview/

Der Schritt, den Sie für eine App Modell V2 Anmeldung in Anspruch nehmen müssen, sind:

  1. Ihre Anwendung registrieren, die Anwendung Anmeldeportal auf https://apps.dev.microsoft.com verwenden. Merken Sie sich die clientID und clientsecret, die für Sie registriert sind.
  2. ein asp.net in VS2015 erstellen ohne Authentifizierung (anonym)
  3. Fügen Sie den Nuget Paket Microsoft.IdentityModel.Clients.ActiveDirectory
  4. In der Steuerung
  5. Sie müssen mit Microsoft.IdentityModel.Clients.ActiveDirectory zu hinzufügen Umfang an Ihrem Code als Privat Mitglied

private static string [] Tive = { "https://graph.microsoft.com/calendars.readwrite"};

  1. Fügen Sie die folgenden Einstellungen hinzufügen

    <add key="ida:ClientID" value="..." /> 
    <add key="ida:ClientSecret" value="..." /> 
    
  2. Sie müssen web.config 2 zusätzliche Methoden erstellen. Eine für die signin und eine für das Autorisieren:

Signin:

 public async Task<ActionResult> SignIn() 
    { 
     string authority = "https://login.microsoftonline.com/common/v2.0"; 
     string clientId = System.Configuration.ConfigurationManager.AppSettings["ida:ClientID"]; 
     AuthenticationContext authContext = new AuthenticationContext(authority); 

     // The url in our app that Azure should redirect to after successful signin 
     Uri redirectUri = new Uri(Url.Action("Authorize", "Home", null, Request.Url.Scheme)); 

     // Generate the parameterized URL for Azure signin 
     Uri authUri = await authContext.GetAuthorizationRequestUrlAsync(scopes, additionalScopes, clientId, 
      redirectUri, UserIdentifier.AnyUser, null); 

     // Redirect the browser to the Azure signin page 
     return Redirect(authUri.ToString()); 
    } 

Autorisieren:

 public async Task<ActionResult> Authorize() 
    { 
     // Get the 'code' parameter from the Azure redirect 
     string authCode = Request.Params["code"]; 

     string authority = "https://login.microsoftonline.com/common/v2.0"; 
     string clientId = System.Configuration.ConfigurationManager.AppSettings["ida:ClientID"]; 
     string clientSecret = System.Configuration.ConfigurationManager.AppSettings["ida:ClientSecret"]; 
     AuthenticationContext authContext = new AuthenticationContext(authority); 

     // The same url we specified in the auth code request 
     Uri redirectUri = new Uri(Url.Action("Authorize", "Home", null, Request.Url.Scheme)); 

     // Use client ID and secret to establish app identity 
     ClientCredential credential = new ClientCredential(clientId, clientSecret); 

     try 
     { 
      // Get the token 

      var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
       authCode, redirectUri, credential, scopes); 

      // Save the token in the session 
      Session["access_token"] = authResult.Token; 
      return Redirect(Url.Action("Tasks", "Home", null, Request.Url.Scheme)); 
     } 
     catch (AdalException ex) 
     { 
      return Content(string.Format("ERROR retrieving token: {0}", ex.Message)); 
     } 
    } 

Die accestoken ist in einem Sitzungszustand.

Jetzt können Sie graph.microsoft.com rufen mit dem richtigen accesstoken und die Daten erhalten:

 private async Task<List<DisplayEvent>> GetEvents() 
    { 
     List<DisplayEvent> tasks = new List<DisplayEvent>(); 

     HttpClient httpClient = new HttpClient(); 
     var accessToken = (string)Session["access_token"]; 

     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
     HttpResponseMessage response = await httpClient.GetAsync("https://graph.microsoft.com/beta/users/me/events"); 

     if (response.IsSuccessStatusCode) 
     { 
      string s = await response.Content.ReadAsStringAsync(); 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      EventModels eventList = serializer.Deserialize<EventModels>(s); 

      foreach (EventModel v in eventList.value) 
      { 
       //Fill tasks will events 
      } 
     } 
     return tasks; 
    } 
Verwandte Themen