Dieser Artikel wurde maschinell übersetzt.

Vorhersage: "Cloudy"

Kombinieren von Clouddiensten

Joseph Fultz

Joseph FultzBis jetzt habe ich Zeit Lösungen mithilfe von Microsoft Windows Azure oder SQL Azure Lösungsarchitektur Erweiterung verwendet. In diesem Monat bin ich untersucht, wie mehrere Cloud-Services in einer einzigen Anwendung kombiniert machen. Mein Beispiel wird Windows Azure, Windows Azure AppFabric Access Control, Bing Maps und Facebook bieten ein Beispiel für das Verfassen von Cloud-Services kombinieren.

Für diejenigen, die sind ein wenig setzen beim Nachdenken über Identitätsverbund oder den realen Wert der sozialen Netzwerk, ich möchte Marcelus vorstellen. Er ist einer meiner Freunde, die ein Wohn- und Reinigung Unternehmen zuständig ist. Ähnlich wie mein Vater in seinem geschäftliche und persönliche Geschäfte, weiß er jemanden zu tun oder fast alles möchten oder müssen, in der Regel in irgendeiner Form von Tausch zu erhalten. Einige könnte dies erkennen, wie dem berüchtigten funktionierenden Ol' Knaben-Netzwerk, aber Marcelus werden betrachten und sehe ich eine lebende breathing Beispiel für die Windows Azure AppFabric Access Control Service (oder kurz ACS) in Kombination mit einem leistungsstarken sozialen Netzwerk. In der Praxis kann ich Marcelus und andere wie ihm unterstützend nutzen.

Wenn ich eine Reihe von Cloud-Diensten, die sie häufig benötigen verwenden, kennen, bevor ich ermöglichen jedoch in der virtuellen Welt mich auf ihre Funktionen zuzugreifen. Da ich wirklich Marcelus Webseiten dienen zu programmieren, werde ich in die Clouddienste verwenden Abbildung 1 um einige Funktionen bereitzustellen.

Abbildung 1 Cloud-Services und deren Funktionen

Service Funktionalität
Windows Azure Meine Website hosten und Seiten
AppFabric Access Control Verwalten und Aushandlungsauthentifizierung zwischen meinem Standort und Facebook
Facebook Authentifizieren von Benutzern und sozialen Netzwerkdienste bereitstellt
Bing Maps Freunde Hometowns visualisieren

Das Szenario ist, dass die Navigation zu meiner Website-Homepage von Facebook authentifiziert werden und die Ansprüche werden wieder auf meiner Website übergeben. Die Website wird ziehen Sie dieses Benutzers Freunde aus Facebook und später Abrufen von Informationen für einen ausgewählten Freund. Wenn ausgewählte Freund eine Heimatort angegeben wurde, der Benutzer kann auf dem Heimatort Namen klicken und der Bing-Karte anzeigen.

Konfigurieren der Authentifizierung zwischen Diensten

Der Dezember 2010 Ausgabe des MSDN Magazin hatte einen guten Überblick die Übersichtsartikel für ACS, die sich am MSDN.Microsoft.com/magazine/gg490345. Werde ich bestimmte Dinge zu tun, um Meine Website für Facebook Föderation benötigten. Abzurufenden überhaupt richtig, verwende AppFabric Labs, ich die Entwicklervorschau von Windows Azure AppFabric ist. Ich verwende Windows Azure-SDK 1.3 darüber hinaus, und ich habe Windows Identity Foundation SDK 4.0 installiert. Zunächst habe ich in Portal.appfabriclabs.com und registriert. Nachdem ich den Zugriff auf die ACS hatte, wird den ersten Teil der Richtungen finden Sie auf der Seite (ACS-Beispiele und Dokumentation (Labs) CodePlex gefolgtBit.LY/fuxkbl) zum Abrufen des Service-Namespaces einrichten. Das nächste Ziel wurde zum Abrufen von Facebook als Identitätsprovider eingerichtet, aber zu tun, dass ich musste zunächst eine Facebook-Anwendung zu erstellen (siehe Anweisungen am Bit.LY/e9yE3I), wodurch eine Zusammenfassung, in Abbildung 2.

image: Facebook Application Configuration Summary

Abbildung 2 Konfigurationszusammenfassung für Facebook-Anwendung

Diese Zusammenfassungsseite ist wichtig, wie muss ich als Identitätsprovider in ACS Informationen daraus in meinem Facebook-Konfiguration verwenden. Insbesondere muss ich die Anwendungs-ID und das Geheimnis der Anwendung in den Konfigurationsinformationen von ACS in dargestellten gesehen werden können Abbildung 3.

image: ACS Facebook Identity Provider Configuration

Abbildung 3 ACS Facebook Identität Anbieterkonfiguration

Beachten Sie, dass ich Friends_hometown in das Textfeld Berechtigungen Anwendung hinzugefügt haben. Ich brauche diese Adresse zum Zuordnen und ohne Angabe es hier wouldn't erhalte es in der Standardeinstellung. Wenn ich einige andere Daten über den Benutzer zurückgegeben werden soll, durch die Graph-API-Aufrufe wollte, müsste ich an die Facebook-Entwickler-Website (nachschlagenBit.LY/c8UoAA) und das Element in der Liste der Anwendung Berechtigungen einzuschließen.

Etwas erwähnenswert beim Arbeiten mit ACS: Sie Parteien verlassen, mit denen jeder Identitätsprovider angeben. Wenn meine Website unter jofultz.cloudapp vorhanden ist. NET, wird es als eine relying Party auf der Identitätsprovider-Konfiguration angegeben werden. Dies gilt auch für meine Localhost. Also, für den Fall, dass ich nicht in der Wolke push zum testen möchten, ich brauche eine relying Party von "localhost" Konfigurieren und wählen diese, wie in dargestellt Abbildung 4.

image: ACS Facebook Identity Provider Configuration: Relying Parties

Abbildung 4 ACS Facebook Identität Anbieterkonfiguration: Relying Parties

Abbildung 3 und Abbildung 4 sind beide auf derselben Seite zum Konfigurieren der Identitätsprovider gefunden. Aus den gleichen Gründen, wenn ich nur für Localhost konfiguriert, aber aus meiner Website authentifizieren wollten hatte, funktionierte es nicht. Kann ich eine benutzerdefinierte Anmeldeseite erstellen, und Leitfäden und ein Beispiel dafür unter Integration von Anwendungen in der ACS-Management-Website vorhanden ist. In diesem Beispiel habe ich nur die Standardseite ACS gehostet unnötig.

Ich habe bisher konfiguriert ACS und mein Facebook-Anwendung, damit sie sprechen einmal aufgerufen. Die nächste Schritt besteht darin, diese Identitätsprovider für meine Site als Mittel zur Authentifizierung zu konfigurieren. Die einfachste Möglichkeit hierzu ist die Windows-Identität Foundation SDK 4.0 finden Sie unter Installieren Bit.LY/ew6K5z. Nach der Installation wird es eine mit der rechten Maustaste im Menüoption zum Hinzufügen von STS-Verweis, wie in dargestellt Abbildung 5.

image: Add STS Reference Menu Option

Abbildung 5 Hinzufügen der Menüoption STS-Referenz

In meinem Beispiel habe ich eine standardmäßige ASP.NET-Website in Visual Studio erstellt werden, indem Sie ein neues Web-Rolle-Projekt. Sobald es erstellt wurde, kann ich mit der rechten Maustaste auf die Website und gehen Sie über die Schritte im Assistenten. Ich werde die Website, um eine vorhandene Security Token Service (STS) verwenden, indem Sie die entsprechende Option im Assistenten auswählen und einen Pfad für die WS-Verbund-Metadaten bereitstellen, konfigurieren. Also, für meine Zugriffskontroll-Namespace lautet der Pfad:

jofultz.AccessControl.appfabriclabs.com/

    FederationMetadata/2007-06 /

    FederationMetadata.xml

Mithilfe dieser Informationen wird der Assistent hinzufügen den Abschnitt "Config" <microsoft.identityModel/>der Site-Konfiguration. Sobald dies geschehen ist, hinzufügen < HttpRuntime-RequestValidationMode = "2.0" / >unterhalb der <system.web/>Element. Bereitstellen, dass ich "localhost" als eine relying Party angegeben, ich wäre, führen Sie die Anwendung und beim Start mit einer Facebook präsentieren kann ACS gehostet Login-Seite dargestellt werden können – oder Windows Live oder Google, bei entsprechender Konfiguration. Microsoft.identityModel-Element ist abhängig von der Existenz der Assembly Microsoft.Identity, so dass Sie sicherstellen, dass diese DLL-Verweis in der Website immer kopieren festgelegt. Wenn es nicht einmal eine Taste gedrückt wird, auf Windows-Azure keine es die DLL und die Website nicht mehr ausgeführt. Website gehostet verweisen auf Meine vorherigen Aussage über die Konfiguration für "localhost" und der Windows-Azure haben müssen, gibt es ein weiteres Bit der Konfiguration nach Abschluss des Assistenten. Folglich wurde der Assistent mit dem Localhost-Pfad konfiguriert, müssen ein Pfad für die Windows-Azure-Site hinzugefügt werden, um die <audienceUris>-Element, wie hier gezeigt:

<microsoft.identityModel>

  <service>

    <audienceUris>

      < value="http://jofultz.cloudapp hinzufügen.
NET / "/ >

      < Mehrwert = "http://localhost:81/"/ >

    </audienceUris>

Darüber hinaus müssen das Realm-Attribut des WsFederation-Elements in der Datei Config entsprechend die aktuellen Position des gewünschten Common Language Runtime. Daher sieht bei der Windows-Azure bereitgestellt, es für mich:

<federatedAuthentication>

  < WsFederation PassiveRedirectEnabled = "true"Aussteller =

   "https://jofultz.accesscontrol.appfabriclabs.com/v2/wsfederation" 

   Realm="http://jofultz.cloudapp.
NET / "RequireHttps = "false"/ >

  < CookieHandler RequireSsl = "false"/ >

</federatedAuthentication>

Jedoch, wenn ich möchte dies Debuggen und damit er zur Laufzeit auf meinem Localhost (für lokales Debuggen) ordnungsgemäß funktioniert, werde ich ändern Bereichsnamen, um darzustellen, in dem die Site lokal, wie z. B. die folgenden gehostet wird:

<federatedAuthentication>

  < WsFederation PassiveRedirectEnabled = "true" 

   Issuer="https://jofultz.AccessControl.
appfabriclabs.com/v2/wsfederation" 

   Realm = "http://localhost:81/" 

   RequireHttps = "false"/ >

  < CookieHandler RequireSsl = "false"/ >

</federatedAuthentication>

Alles richtig konfiguriert ich sollte die Website ausführen und wenn versucht wird, wechseln Sie zur Standardseite werde ich zur ACS gehostet Login-Seite, wo ich Facebook als Identitätsanbieter auswählen können umgeleitet werden. Nach dem Klicken auf Facebook ich bin gesendet, die Facebook-Login-Seite authentifiziert werden (siehe Abbildung 6).

image: Facebook Login

Abbildung 6 Facebook-Login

Da ich meine Anwendung, bevor Sie verwendet haben, Facebook stellt mich mit dem Dialogfeld Berechtigung anfordern, für meine Anwendung wie in Abbildung 7.

image: Application Permission Request

Abbildung 7 Application Berechtigungen anfordern

Nicht, der den inneren Kreis derjenigen ausgelassen werden, die solche eine fantastische app verwenden wollen, kann ich schnell zulassen klicken, nachdem exchange-welche Facebook, ACS- und my app Informationen (über Browser-Umleitungen) und ich bin schließlich umgeleitet zu meiner Anwendung. Zu diesem Zeitpunkt einfach habe ich eine leere Seite, aber weiß, wer ich bin und haben eine Nachricht "Willkommen bei Joseph Fultz" oben rechts auf der Seite.

Facebook-Graph API

Für meine Anwendung muss die Freunde abzurufen, die mein soziale Netzwerk bilden und später Abrufen von Informationen über diese Freunde. Facebook hat die Graph-API, um Entwicklern ermöglichen, die solche Dinge tun. Es ist ziemlich gut dokumentiert, und das beste, es ist eine flache und einfache Implementierung, erleichtert das verstehen und verwenden. Um die Anforderungen zu machen, muss ich eine Access-Token. Glücklicherweise wurde es wieder in die Ansprüche übergeben, und mit Hilfe der Foundation SDK der Windows-Identität, die Ansprüche in der Haupt-Identität platziert wurden. Die Ansprüche werden etwa wie folgt aussehen:

https://Schemas.xmlsoap.org/ws/2005/05/  

    Forderungen/Identity/nameidentifier

  https://Schemas.Microsoft.com/WS/2008/06/

    Forderungen/Identity/Ablauf

  https://Schemas.xmlsoap.org/ws/2005/05/

    Forderungen/Identity/emailaddress

  https://Schemas.xmlsoap.org/ws/2005/05/

    Forderungen/Identity/name 

  http://www.Facebook.com/Claims/AccessToken

  https://Schemas.Microsoft.com/

    Accesscontrolservice/2010/07/Forderungen /

    identityprovider

Was ich wirklich von diesem möchten, ist der letzte Teil der den vollständigen Namen (z. B. Nameidentifier, Ablaufdatum usw.) und den zugehörigen Wert. So kann ich die ParseClaims-Methode, um tease auseinander die Ansprüche und platzieren Sie sie erstellen und deren Werte in eine Hashtabelle für weiter zu verwenden, und rufen Sie diese Methode in das Load-Ereignis der Seite:

Protected void ParseClaims()

{

  String Username = default(string);

  UserName = Page.User.Identity.Name;



  IClaimsPrincipal-Prinzipal = Thread.CurrentPrincipal (IClaimsPrincipal);

  IClaimsIdentity Identität = Principal.Identity (IClaimsIdentity);



  Foreach (Forderung Forderung in Identity.Claims)

  {

    String [] ParsedClaimType = Forderung.ClaimType.Split('/');

    String ClaimKey = ParsedClaimType[ParsedClaimType.Length - 1];



    _Claims.Add (ClaimKey, Forderung.Wert);

  }             

}

Ich erstelle eine FBHelper-Klasse, in denen ich werde die Methoden erstellen, um die Facebook-Informationen zugreifen, die ich wünschen. Um zu starten, erstelle ich eine Methode, um alle erforderlichen Anforderungen zu gestalten. Ich jede Anforderung, die mit dem WebClient-Objekt erstellen und Verarbeiten der Antwort mit der JavaScript-Serialisierungsprogramm:

Öffentliche statische Hashtable MakeFBRequest(string RequestUrl)

{

  Hashtable-ResponseValues = default(Hashtable);



  WebClient-WC = neue WebClient();

  URI Uri = new Uri (String.Format (RequestUrl, FbAccessToken));

           

  String WCResponse = WC.DownloadString(uri);

  JavaScriptSerializer JSS = neue JavaScriptSerializer();

  ResponseValues = JSS.Deserialisieren von <Hashtable> (WCResponse);



  Return ResponseValues;

}

Wie im folgenden Codeausschnitt dargestellt, müssen jede Anforderung Access Token verfügen, die wieder in die Ansprüche übergeben wurde. Mit meiner wiederverwendbare Anforderungsmethode vorhanden erstelle ich eine Methode zum Abrufen von meinen Freunden und in eine Hashtabelle, die mit ihrer Facebook-IDs und die Namen aller zu analysieren:

Öffentliche statische Hashtable GetFBFriends(string AccessToken)

{

  Hashtable-FinalListOfFriends = neue Hashtable();

  Hashtable-FriendsResponse = MakeFBRequest (_fbFriendsListQuery, AccessToken);

  Object [] Freunde (Object []) = FriendsResponse ["Data"];



  für (Int Idx = 0;IDX <Freunde.Länge; Idx ++)

  {

    Dictionary < String, Object >FriendEntry = 

      (Dictionary < String, Object >) Freunde [Idx];

    FinalListOfFriends.Add (FriendEntry ["Id"], FriendEntry["name"]);

  }

  Return FinalListOfFriends;

}

Die Deserialisierung der Freunde-Liste-Antwort führt zu einer geschachtelten Struktur der Hashtable - > Hashtable - > Wörterbuch. Daher habe ich etwas Arbeit, ziehen die Informationen heraus, und platzieren Sie es in meinem eigenen Hash-Tabelle verfügen. Sobald es erstellt ist, fügen Sie kann ich auf Meine Seite default.aspx wechseln ein Listenfeld hinzu, Schreiben Sie ein wenig Code, nehmen die Freunde, und das Ergebnis an meine neue ListBox gebunden:

Protected void GetFriends()

  {

    _Friends = FBHelper.GetFBFriends (_ (String)

      Claims["AccessToken"]);

    Dies.ListBox1.DataSource = _Friends;

    ListBox1.DataTextField = "Wert";

    ListBox1.DataValueField = "Schlüssel";

    ListBox1.DataBind();

  }

Wenn die Anwendung ausgeführt wird zu diesem Zeitpunkt nachdem ich authentifiziert bin ich sehen eine Liste aller meiner Facebook-Freunde. Aber warten – es gibt noch mehr! Ich möchte die verfügbare Informationen für alle ausgewählten Freund erhalten, so dass ich, die für mich ihre Heimatstadt auf einer Landkarte anzeigen verwenden können. Zurückblättern zur Meine FBHelper-Klasse, füge ich eine einfache Methode, mit denen Access Token und die ID des ausgewählten Freund hinzu:

Öffentliche statische Hashtable GetFBFriendInfo(string AccessToken, string ID)

{

  Hashtable-FriendInfo = 

    MakeFBRequest (String.Format (_fbFriendInfoQuery ID) + 

    "? Access_token = {0}", AccessToken);

  Return FriendInfo;

}

Beachten Sie, dass in beiden die Facebook-Hilfsmethoden, die ich erstellt habe ich eine Konstante Zeichenfolge verweisen, die die erforderliche Graph-API-Abfrage enthält:

Public const String _fbFriendsListQuery =   

  "https://graph.facebook.com/me/friends?access_token={0}"; 

Public const String _fbFriendInfoQuery = "https://graph.facebook.com/{0}/";

Mit meiner letzten Facebook-Methode an Stelle ich eine GridView zur Seite hinzufügen und zum Binden an eine Hash-Tabelle einrichten und dann – in der Code-Behind in das SelectedIndexChanged-Methode für die ListBox – in der Hashtabelle, die von der GetFBFriendInfo-Methode zurückgegeben werden binden, wie im in Abbildung 8.

Abbildung 8 eine GridView hinzufügen

Protected void ListBox1_SelectedIndexChanged (Object Sender, EventArgs e)

{

  Debug.WriteLine(ListBox1.SelectedValue.ToString());

  Hashtable-FriendInfo = 

    FBHelper.GetFBFriendInfo ((String) _Claims ["AccessToken"]  

    ListBox1.SelectedValue.ToString());

  GridView1.DataSource = FriendInfo;

  GridView1.DataBind();

  try

  {

    Dictionary < String, Object >HometownDict = 

      (Dictionary < String, Object >) FriendInfo ["Heimatort"];

      _Hometown = HometownDict ["Name"].ToString();

  }

  catch (Exception ex)

  {

    _Hometown = ""; //Not angegeben";

  }

}

Nun, da ich meine Freunde und ihre Info von Facebook zurückzukommen haben, werde ich an der Teil ihrer Heimatstadt auf einer Landkarte anzeigen verschieben.

Es gibt keine direkte Like Home

Ich möchte für alle meine Freunde, die ihre Heimatstadt angegeben haben, klicken auf den Namen Heimatort und haben die Karte, die es zu navigieren. Die erste Schritt besteht darin, die Zuordnung zu der Seite hinzuzufügen. Dies ist eine ziemlich einfache Aufgabe, und zu diesem Zweck bietet Bing ein nettes interactive SDK, die demonstrieren der Funktionalität und ermöglichen Ihnen zu betrachten, und kopieren Sie die Quelle. Es befinden sich unter Microsoft.com/Maps/isdk/AJAX/. Die Seite default.aspx hinzufügen ich Div, halten die Zuordnung wie folgt:

< Div Id = "MyMap"Style = "Position: Relative;Breite: 400 px;400 Höhe: px;">< / Div >

Jedoch um die Karte zu erhalten hinzufügen, ich Skriptverweis und ein wenig Skript zur SiteMaster Seite:

< script Type = "Text/Javascript"src="http://ECN.dev.virtualearth.
NET /

  mapcontrol/mapcontrol.ashx?v=6.2 ">< / script >      

  < script Type = "Text/Javascript" >

    Var Map = Null;

    Function GetMap() {

      Map = neue VEMap('myMap');

      Map.LoadMap();

    }

  </script>

Aus diesem Ort, wenn ich eine Seite ziehen Sie ich werde gestellt werden mit einer Zuordnung auf die Standardposition – aber ich möchte es in Mein Freund Heimatort zu verschieben, wenn Sie es auswählen. Während das SelectedIndexChanged-Ereignis, das weiter oben erläuterten ich auch eine Bezeichnung auf der Seite gebunden, auf den Namen und einen clientseitigen Click-Ereignis auf die Karte finden eine Position basierend auf dem Wert der Bezeichnung haben hinzugefügt:

Onclick = "zuordnen.Suchen (Null, hometown.innerText, 

    NULL, Null, Null, Null, True, Null, True); 

    Map.SetZoomLevel(6);"

In der Zuordnung.Suchen-Aufruf, der Großteil der nachstehende Parameter könnte unterbrochen, falls gewünscht. Die Referenz für die Find-Methode finden Sie unter MSDN.Microsoft.com/library/bb429645. Das ist alles, die zum Anzeigen und interagieren mit der Karte in diesem einfachen Beispiel erforderlich ist. Jetzt bin ich bereit, für die Ausführung in allen seinen Ruhm.

Wenn ich die IdentityModel ordnungsgemäß für die Arbeit mit meinem Localhost wie bereits erwähnt konfiguriert haben, kann ich drücken Sie F5, und lokal in Debug ausführen. Also, ich drücken Sie F5, finden Sie in einem Browserfenster pop bis, und es kann ich mit meinem Anmeldeoptionen präsentiert bin. Ich wähle Facebook und ich bin getroffen, um die Anmeldeseite angezeigt, die Abbildung 6. Anmelden ich bin zurück zu meinem default.aspx-Seite geleitet, welche jetzt zeigt meine Freunde und eine Standardkurve wie in in Abbildung 9.

image: Demo Homepage

Abbildung 9 Demo-Homepage

Als Nächstes werde ich meine Freunde durchsuchen und klicken Sie auf eine. Ich werde verfügbaren Informationen, die mir auf der Grundlage seiner Sicherheitseinstellungen und die Anwendung Berechtigungen ich, angefordert Wenn ich dem Identitätsprovider, einrichten wie in Abbildung 2. Ich werde klicken Sie anschließend im Namen Heimatort oberhalb der Karte und die Karte wird verschoben, um die Heimatstadt zu zentrieren, wie in Abbildung 10.

image: Hometown in Bing Maps

Abbildung 10 Heimatort Bing Maps

Schlussbemerkung

Ich hoffe, ich habe klar formulierte wie verschiedene Aspekte der Windows-Azure Plattform, Bing Maps und Facebook zusammengefügt – und dass ich gezeigt habe, wie einfach es ist. Mithilfe von ACS, konnte ich eine Beispielanwendung aus einer Komposition von Cloud-Technologie erstellt. Mit ein wenig mehr Aufwand ist es genauso einfach zum Einbinden in Ihre eigenen persönlichen Service zu dienen, wenn es benötigt wird. Das Schöne in diesem Verband der Identität besteht darin, dass mithilfe von Windows-Azure können Sie gegen entwickeln und Services von anderen Herstellern und anderen Plattformen integrieren – im Vergleich zu begrenzen Sie eine einzige Auswahlmöglichkeit des Providers und Dienste des Anbieters oder durchführen zu lassen, eine Low Fidelity-Integrationsmethode zu ermitteln. Stromversorgung im Microsoft Windows Azure Platform ist, und diese Leistung gehört wie leicht es zusammen mit anderen Cloud-Services mashed werden kann.

Joseph Fultz ist als Architekt im Microsoft Technology Center in Dallas, und mit Enterprise-Kunden und ISVs entwerfen und Erstellen von Prototypen für Software-Lösungen arbeitet für Unternehmen zu erfüllen und Anforderungen zu vermarkten. Er hat bei Veranstaltungen wie Tech · gesprochen.ED und ähnliche interne Schulungen und Veranstaltungen.

Dank an den folgenden technischen Experten für die Überprüfung dieses Artikels: Steve Linehan