本文章是由機器翻譯。

Forecast: Cloudy

定域機組服務交互

約瑟夫 Fultz

下載程式碼範例

往上直到現在,我已經花費時間上使用 Microsoft Windows Azure 或 SQL Azure 來擴充解決方案架構的解決方案。這個月我看看如何將多個定域機組服務組合成一個單一的應用程式一個。我的範例仍將組合 Windows Azure]、 [Windows Azure AppFabric 存取控制]、 [Bing 地圖及 [Facebook] 提供的撰寫定域機組服務範例。

對新手而言有點延遲思考同盟識別身分或共享網路的實際值時,我想要引入 Marcelus。他是我的朋友擁有住家和商業清潔公司。類似於在他的商務和個人打交道我父親,他知道其他人進行,或取得任何您想要或需要,通常在某種形式的 barter。一些可能認得這是惡名昭彰好 ol' 男生的網路,但我查看 Marcelus 並我看到 944 年呼吸 Windows Azure AppFabric 存取控制服務 (或簡稱為 ACS) 加上強大的社交網路的範例。在現實生活中我可以利用 Marcelus 和其他人跟他幫助我一樣。

不過,在虛擬世界中,當我使用了一些他們通常需要知道我之前的定域機組服務它們允許我以存取其功能。因為我真的無法程式設計來處理網頁的 Marcelus,我將使用中的定域機組服務 圖 1 提供某些功能。

圖 1定域機組服務和其功能

服務 功能
Windows Azure 裝載我的網站和網頁提供服務
AppFabric 存取控制 管理及交涉我站台與 Facebook 之間的驗證
Facebook 驗證使用者,並提供社交網路服務
Bing 對應 以視覺化方式檢視朋友 hometowns

案例是瀏覽至我的網站首頁會經過 Facebook,而宣告將會傳遞返回我的網站。站台會然後將該使用者的朋友從 Facebook 拉和後續擷取選取的好友的資訊。如果所選取的好友有指定故鄉,使用者可能故鄉名稱上按一下,然後 Bing 地圖會顯示它。

設定服務之間的驗證

2010 年 12 月發行的 msdn Magazine 的 ACS,您可以在找到有良好的概觀文章 msdn.microsoft.com/magazine/gg490345.我會掩護我需要進行聯盟 Facebook 我網站的特定項目。若要取得此持續運作,我使用頭戴式 AppFabric 實驗室,也就是 Windows Azure AppFabric 的開發人員預覽。此外,我使用頭戴式 Windows Azure SDK 1.3 和已安裝了 Windows 識別基礎 SDK 4.0。若要開始,我去 portal.appfabriclabs.com 及已登錄。一旦我有存取權 ACS,我之後,請參閱 [ACS 範例和文件 (實驗室) CodePlex 頁面的指示的第一個部分 (bit.ly/fuxkbl) 以取得設定的服務命名空間。下一步的目標是取得 Facebook 設定為識別提供者,但為了執行我必須先建立一個 Facebook 應用程式 (請參閱指示在 bit.ly/e9yE3I),而導致這樣在摘要 圖 2.

圖 2Facebook 應用程式組態摘要

此摘要頁面很重要,因為我需要將資訊從我的 Facebook 的組態中作為 acs 識別提供者。特別是,我需要應用程式識別碼及應用程式密碼中所示的 ACS 的組態資訊中可以看出 圖 3

圖 3 ACS Facebook 識別提供者組態

請注意我已將 friends_hometown 新增到 [應用程式的權限] 文字方塊中。我需要對應,該位址,而不需要在此指定我不會重新取得該段預設值。如果我想要傳回之使用者的相關圖表 API 呼叫的某些其他資料,我必須查閱 Facebook 開發人員網站 (bit.ly/c8UoAA) 並將項目包含在應用程式權限] 清單。

您指定會使用每個身分識別提供者藉由對象。如果我的網站有 jofultz.cloudapp。net,它會指定為信賴識別提供者的設定。這也適用於我本機主機。因此,以防我不想要發送到定域機組進行測試,我必須設定本機主機信賴,並選取它,如所示 圖 4

Figure 4 ACS Facebook Identity Provider Configuration: Relying Parties

圖 3圖 4 兩者都記錄在相同的頁面設定識別提供者。基於同樣的理由,如果我只擁有它設定為本機主機,但然後嘗試從我的網站上進行驗證,它不會運作。我可以建立自訂登入頁面,而且沒有指引及樣本 ACS 管理網站中的應用程式整合在這種方式。這個範例中,我只採用預設 ACS 裝載頁面。

到目前為止已設定 ACS 和我的 Facebook 應用程式,可讓它們一次叫用的交談。下一步是驗證的將我的網站此識別提供者設定為方法。若要這麼做最簡單的方法是安裝,請參閱 Windows 識別基礎 SDK 4.0bit.ly/ew6K5z.安裝之後,會有上按一下滑鼠右鍵功能表選項可用來新增 STS 參考中所示 圖 5

圖 5新增 STS 參考功能表選項

在我的範例中,我會使用預設的 ASP。NET 站台以選取新的網頁角色專案建立 Visual Studio 中。一旦建立之後仍然我網站上按一下滑鼠右鍵,並執行逐步執行精靈。我會設定要使用現有的安全性權杖服務 (STS),方法是在精靈中選擇該選項並提供 WS-同盟中繼資料的路徑的站台。因此,為我存取控制項的命名空間,則路徑是:

jofultz.accesscontrol.appfabriclabs.com/

    FederationMetadata/2007-06/

    FederationMetadata.xml

使用這項資訊,精靈將會加入組態區段 <microsoft.identityModel/>站台組態。 一旦這麼做,新增 < httpRuntime requestValidationMode ="2.0"/ >下 <system.web/>項目。 提供我指定本機主機為信賴,我應該要能夠執行應用程式,並在啟動後會出現一個 ACS 裝載登入頁面,其中會顯示 Facebook — 或 Windows Live] 或 [Google,如果設定成如此。 Microsoft.identityModel 項目是相依於 Microsoft.Identity 組件存在,因此您必須確定該 DLL 參考設定為 [永遠複製站台中。 如果不是,一旦它推入至 Windows Azure 它不會有 DLL 和網站將無法執行。 指的我先前的陳述式相關不必為本機主機的設定及 Windows Azure 主控的網站,則有更多位元的設定精靈一旦完成。 因此,如果精靈已設定為使用本機路徑,然後 Windows Azure 站台的路徑必須要加入至 <audienceUris>項目如下所示:

<microsoft.identityModel>

  <service>

    <audienceUris>

      <add value="http://jofultz.cloudapp.
net/" />

      <add value="http://localhost:81/" />

    </audienceUris>

此外,在組態中的 wsFederation 項目領域屬性必須以反映目前的所需的執行階段位置。 因此,當部署至 Windows Azure,它會尋找像這樣我:

<federatedAuthentication>

  <wsFederation passiveRedirectEnabled="true" issuer=

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

   realm="http://jofultz.cloudapp.
net/" requireHttps="false" />

  <cookieHandler requireSsl="false" />

</federatedAuthentication>

不過,如果我想要偵錯,並且讓它在執行階段在我的本機主機上 (適用於本機偵錯) 正常運作,我將會變更領域來代表網站放置在本機,如下所示:

<federatedAuthentication>

  <wsFederation passiveRedirectEnabled="true" 

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

   realm="http://localhost:81/" 

   requireHttps="false" />

  <cookieHandler requireSsl="false" />

</federatedAuthentication>

所有項目正確設定,我應該要能夠執行站台,與時嘗試瀏覽到預設頁面我將會被重新導向到 ACS 裝載登入網頁,讓我可以選擇為識別提供者的 Facebook。一旦按 Facebook 時,我傳送給 Facebook 登入頁面,以進行驗證 (請參閱 圖 6)。

圖 6Facebook 登入

因為我沒有使用我的應用程式之前,Facebook 提供我與我的應用程式,[要求權限] 對話方塊中所見 圖 7

圖 7 應用程式權限要求

不想要保留的人使用這類好的應用程式的線條圓形用完,我快速地按一下 [允許],重新哪些 Facebook、 ACS 和我的應用程式交換之後 (透過瀏覽器重新導向) 的資訊和我最後導向至我的應用程式。我只是有空白頁,此時,但它確實知道我是誰,我在上方會有 「 歡迎使用約瑟夫 Fultz 」 訊息頁面的權限。

Facebook 圖表 API

我的應用程式,我需要擷取朋友組成我共享的網路,然後緊接著擷取這些朋友的相關資訊。Facebook 已提供可讓開發人員變得之圖形 API。它還真是激勵制訂詳細且最棒的它是平面及簡單的實作,因而使其易於瞭解和使用。若要提出要求,我需要存取語彙基元。幸運的是,它之前所傳遞回中宣告,並使用的 Windows 識別基礎 SDK 說明,請宣告有已放入主體的識別。宣告看起來像這樣:

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

    identity/claims/nameidentifier

  https://schemas.microsoft.com/ws/2008/06/

    identity/claims/expiration

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

    identity/claims/emailaddress

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

    identity/claims/name 

  http://www.facebook.com/claims/AccessToken

  https://schemas.microsoft.com/

    accesscontrolservice/2010/07/claims/

    identityprovider

其實我是想出的是最後一個部分 (例如,nameidentifier、 到期日等等) 的完整名稱和相關的值。 因此我建立分開的 tease 宣告,並將它們的 ParseClaims 方法與它們的值的雜湊資料表的進一步使用,然後在網頁載入事件中呼叫該方法:

protected void ParseClaims()

{

  string username = default(string);

  username = Page.User.Identity.Name;



  IClaimsPrincipal Principal = (IClaimsPrincipal) Thread.CurrentPrincipal;

  IClaimsIdentity Identity = (IClaimsIdentity) Principal.Identity;



  foreach (Claim claim in Identity.Claims)

  {

    string[] ParsedClaimType = claim.ClaimType.Split('/');

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



    _Claims.Add(ClaimKey, claim.Value);

  }             

}

我建立我要在其中建立存取我想要的 Facebook 資訊的方法是 FBHelper 類別。 若要開始,我建立的方法,讓所有的所需的要求。 我將會做使用 WebClient 物件每個要求,並剖析與 JavaScript 序列化程式的回應:

public static Hashtable MakeFBRequest(string RequestUrl)

{

  Hashtable ResponseValues = default(Hashtable);



  WebClient WC = new WebClient();

  Uri uri = new Uri(String.Format(RequestUrl, fbAccessToken));

           

  string WCResponse = WC.DownloadString(uri);

  JavaScriptSerializer JSS = new JavaScriptSerializer();

  ResponseValues = JSS.Deserialize<Hashtable>(WCResponse);



  return ResponseValues;

}

如這個程式碼片段所示,每個要求必須有存取權杖傳遞回在宣告中。 使用就地我可重複使用的要求方法,我建立方法以擷取我的朋友,並剖析至含有每個其 Facebook Id 和名稱的雜湊資料表:

public static Hashtable GetFBFriends(string AccessToken)

{

  Hashtable FinalListOfFriends = new Hashtable();

  Hashtable FriendsResponse = MakeFBRequest(_fbFriendsListQuery, AccessToken);

  object[] friends = (object[])FriendsResponse["data"];



  for (int idx = 0; idx < friends.Length;idx++ )

  {

    Dictionary<string, object> FriendEntry = 

      (Dictionary<string, object>)friends[idx];

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

  }

  return FinalListOfFriends;

}

朋友清單回應還原序列化會導致巢狀結構 Hashtable-> Hashtable-> 字典。 因此我必須執行一些工作來取出資訊,然後將它放入我自己的雜湊資料表。 它放好之後,切換到我 default.aspx] 頁面上,新增清單方塊、 撰寫一些程式碼來抓出朋友並將結果繫結到我新增的清單方塊:

protected void GetFriends()

  {

    _Friends = FBHelper.GetFBFriends((string)_

      Claims["AccessToken"]);

    this.ListBox1.DataSource = _Friends;

    ListBox1.DataTextField = "value";

    ListBox1.DataValueField = "key";

    ListBox1.DataBind();

  }

如果我執行應用程式在此時,當我正在驗證我會看到所有我 Facebook 的朋友清單。 不過先別急,還有更多 ! 我需要取得任何選取的好友的可用資訊,讓我可以用它來顯示給我看他們故鄉在地圖上。 我免於返回到我的 FBHelper 類別,加入一個簡單的方法,將會存取語彙基元和所選取的好友的識別碼:

public static Hashtable GetFBFriendInfo(string AccessToken, string ID)

{

  Hashtable FriendInfo = 

    MakeFBRequest(String.Format(_fbFriendInfoQuery, ID) + 

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

  return FriendInfo;

}

請注意在這兩個我所建立的 Facebook helper 方法,我參考常數字串,包含所需的圖形 API 查詢:

public const string _fbFriendsListQuery =   

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

public const string _fbFriendInfoQuery = "https://graph.facebook.com/{0}/";

使用就地我最後 Facebook 方法,我將 GridView 加入網頁,並設定繫結至雜湊資料表,然後再 — 在程式碼後置 SelectedIndexChanged 方法中的清單方塊中,我會將它連結到所傳回的 GetFBFriendInfo 方法將雜湊表如所示 圖 8

圖 8 加入 GridView

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["hometown"];

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

  }

  catch (Exception ex)

  {

    _Hometown = "";//Not Specified";

  }

}

既然我會掩護我的朋友] 和 [上一步來自 Facebook 其資訊,我將會移動到地圖上顯示其故鄉的部分。

沒有任何位置類似首頁

對於那些有指定其故鄉我朋友,我希望能故鄉名稱上按一下,並讓瀏覽有的對應。 第一個步驟是要新增地圖至網頁。 這是個很簡單的動作,並在那之後,Bing 提供不錯的互動式 SDK 來示範功能,並讓您查看和複製來源。 您可以在找到 microsoft.com/maps/isdk/ajax/. 若 default.aspx 網頁,要我加入,讓 div 來保存地圖上的,就像這樣:

  <div  id="myMap" style="position:relative; width:400px; height:400px;" ></div>

不過,要取得對應,我新增指令碼參考和一些指令碼至 SiteMaster 頁面:

    <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 = new VEMap('myMap');
    
          map.LoadMap();
    
        }
    
      </script>

這地方,我摘下你版面配置時我會看到與預設位置對應 — 但我要它時,我選取移至我的朋友故鄉。 在先前所討論的 SelectedIndexChanged 事件,我也的繫結標籤在頁面中的名稱,並加入用戶端 click 事件讓尋找位置標籤的值為基礎的對應:

    onclick="map.Find(null, hometown.innerText, 
    
        null, null, null, null, true, null, true); 
    
        map.SetZoomLevel(6);"

在對應。如果您想要可以保留尋找呼叫,大部分的後端的參數。您可以在找到 Find 方法的參考msdn.microsoft.com/library/bb429645.這是所有所需顯示並與其互動這個簡單的範例中的對應。現在我準備好可以執行所有其愛慾。

如果我已設定正確才能使用如先前所述我 localhost identityModel,我可以按下 f5 鍵,並在偵錯在本機上執行。因此,我按 F5,請參閱瀏覽器視窗快顯出現我登入選項,並那里。我選擇 Facebook,我與所顯示的登入網頁前往 圖 6。一旦登入,我導向回到我 default.aspx 網頁,哪些現在會顯示我的朋友和預設對應,在 圖 9

圖 9示範首頁

接下來,我將會瀏覽我的朋友,按一下其中一個。我會寄給我根據其安全性設定和我要求當我設定識別提供者中所見的應用程式權限可用的資訊 圖 2。接下來,我會按一下位於對應表上面的故鄉名稱中,地圖會移動到如所示,故鄉,放在畫面中央 圖 10

圖 10 Bing 對應的故鄉

結論

我希望我明確呈現出來如何以將一起 Windows Azure 平台,Bing 地圖與 Facebook 的幾個層面,和我已經示範是多麼的容易。我使用 ACS,便能從定域機組技術的複合稿建立範例應用程式。與多花一點功夫,它也一樣簡單將潛在中識別服務做為需要它。在這個同盟識別身分的優點是使用 Windows Azure 可讓您開發並將來自其他廠商和其他平台的服務,與您限制成單一選擇的提供者和該提供者的服務,或需要找出低逼真度整合方法。在 Microsoft Windows Azure 平台沒有電源,而該電源部分是如何輕鬆地與其他定域機組服務一起 mashed。

Joseph Fultz 是架構設計人員,達拉斯為基地,他在工作與企業客戶和 Isv 符合業務和行銷需求的設計及原型設計軟體解決方案的 Microsoft 技術中心。他已在事件,例如 Tech· 的語音Ed 和類似的內部訓練事件。

感謝至下列技術專家檢閱這份文件:Steve Linehan