如何:針對自訂錯誤處理使用錯誤 URL
更新日期:2015 年 6 月 19 日
適用對象:Azure
套用至
- Microsoft Azure Active Directory 存取控制服務 (也稱為「存取控制服務」或 ACS)
總結
本主題說明如何使用錯誤 URL 功能,在信賴憑證者應用程式中實作自訂登入錯誤處理。 錯誤 URL 可讓您將 ACS 產生的錯誤傳送回信賴憑證者應用程式,讓應用程式可以記錄並回應錯誤。 例如,ASP.NET 網站可以使用錯誤 URL 功能,對使用者顯示和網站具有相同外觀及操作方式的錯誤訊息。
目錄
目標
概觀
步驟摘要
步驟 1 – 啟用錯誤 URL 功能
步驟 2 – 建立錯誤協助程式類別
步驟 3 – 處理 JSON 編碼的錯誤訊息
步驟 4 – 設定對錯誤頁面的匿名存取
步驟 5 – 測試您的工作
目標
識別使用錯誤 URL 功能所需的組態。
識別處理 ACS 錯誤訊息所需的協助程式碼。
識別和排解潛在問題。
概觀
錯誤 URL 會指定 ACS 在登入程式期間發生錯誤時,將使用者重新導向至其中的網址。 錯誤 URL 目標通常是信賴憑證者應用程式所主控的自訂錯誤頁面。 在重新導向過程中,ACS 會將錯誤的相關資訊傳回給信賴憑證者應用程式做為 JSON 編碼的 HTTP URL 參數。 您可以在自訂錯誤頁面中納入 JSON 編碼的錯誤資訊,和 (或) 顯示靜態說明文字。 以下是 JSON 編碼的錯誤訊息範例。
{"context":null,"httpReturnCode":401,"identityProvider":"Google","timeStamp":"2010-12-17 21:01:36Z","traceId":"16bba464-03b9-48c6-a248-9d16747b1515","errors":[{"errorCode":"ACS30000","errorMessage":"There was an error processing an OpenID sign-in response."},{"errorCode":"ACS50019","errorMessage":"Sign-in was canceled by the user."}]}
步驟摘要
使用下列程式來處理 ACS 錯誤訊息:
步驟 1 – 啟用錯誤 URL 功能
步驟 2 – 建立錯誤協助程式類別
步驟 3 – 處理 JSON 編碼的錯誤訊息
步驟 4 – 設定對錯誤頁面的匿名存取
步驟 5 – 測試您的工作
步驟 1 – 啟用錯誤 URL 功能
為您的信賴憑證者啟用錯誤 URL 功能
移至Microsoft Azure管理入口網站 (https://manage.WindowsAzure.com) 登入,然後按一下[Active Directory]。 (疑難排解提示: 「Active Directory」 專案遺失或無法使用)
若要管理存取控制命名空間,請選取該命名空間,然後按一下 [管理]。 (或按一下 [存取控制命名空間]、選取 [命名空間],然後按一下 [管理])。
按一下 [信賴憑證者應用程式],然後選取信賴憑證者應用程式。
在 [編輯信賴憑證者應用程式] 頁面上的 [錯誤 URL] 欄位中,輸入您的錯誤頁面 URL。
ACS 會在發生登入錯誤時,將使用者重新導向至此頁面。 此外,ACS 會將 JSON URL 編碼參數傳送至此頁面,其中包含錯誤詳細資料。
步驟 2 – 建立錯誤協助程式類別
此步驟會建立將 JSON 編碼的錯誤訊息還原序列化的錯誤協助程式類別。
建立錯誤協助程式類別
將類別檔案加入至您的 Web 應用程式,並為其指定名稱,例如 Error.cs。
依照下列方式實作 Error 類別。
public class Error { public string errorCode { get; set; } public string errorMessage { get; set; } }
新增另一個類別檔案,並提供名稱,例如 ErrorDetails.cs。
依照下列方式實作 ErrorDetails 類別。
public class ErrorDetails { public string context { get; set; } public int httpReturnCode { get; set; } public string identityProvider { get; set; } public Error[] errors { get; set; } }
處理 ACS 的錯誤訊息時,這些類別將會在下一個步驟中使用。
步驟 3 – 處理 JSON 編碼的錯誤訊息
此步驟示範如何處理 ACS 產生的 JSON 編碼錯誤訊息。
處理 ACS 所產生的 JSON 編碼的錯誤訊息
將 ASPX 網頁加入至您的 ASP.NET 應用程式,並為其指定名稱,例如 ErrorPage.aspx。
將下列標籤控制項加入至 ASP.NET 標記。
<asp:Label ID="lblIdntityProvider" runat="server"></asp:Label> <asp:Label ID="lblErrorMessage" runat="server"></asp:Label>
切換至頁面的程式碼後置檔案 ErrorPge.aspx.cs。
將下列宣告加入至頂端。
using System.Web.Script.Serialization;
將下列程式碼加入至 Page_Load 方法。
JavaScriptSerializer serializer = new JavaScriptSerializer(); ErrorDetails error = serializer.Deserialize<ErrorDetails>( Request["ErrorDetails"] ); lblErrorMessage.Text = string.Join("<br/>", error.errors.Select(er => string.Format("Error Code {0}: {1}", er.errorCode, er.errorMessage)).ToArray());
此程式碼會處理來自 ACS 的 JSON 編碼錯誤訊息。
步驟 4 – 設定對錯誤頁面的匿名存取
此步驟會設定對 ErrorPage.aspx 檔案的匿名存取。 如果頁面受到保護且需要授權,則會產生無限重新導向迴圈。 如果 ACS 嘗試存取頁面時發生此問題,ACS 會傳送 JSON 編碼的錯誤。
注意
由於錯誤頁面可匿名存取,且該頁面可能包含回應 HTML 和 (或) 將資料寫入資料庫的程式碼,因此您應確實防止跨網站指令碼處理和 SQL 插入式攻擊。 下列資源有其詳細說明:
-
如何:防止 ASP.NET (中的跨網站腳本https://go.microsoft.com/fwlink/?LinkID=178708).
-
如何:防止 ASP.NET (中的插入式攻擊https://go.microsoft.com/fwlink/?LinkID=157572).
-
如何:保護 ASP.NET 中的SQL插入https://go.microsoft.com/fwlink/?LinkID=212978.
設定對錯誤頁面的匿名存取
在您的應用程式中開啟 web.config,並加入下列項目。
<location path="ErrorPage.aspx"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location>
這可確保對您頁面的存取不會造成無限重新導向迴圈。
步驟 5 – 測試您的工作
此步驟將測試您的錯誤 URL 組態和實作。
為您的信賴憑證者啟用錯誤 URL 功能
移至Microsoft Azure管理入口網站 (https://manage.WindowsAzure.com) 登入,然後按一下[Active Directory]。 (疑難排解提示: 「Active Directory」 專案遺失或無法使用)
若要管理存取控制命名空間,請選取該命名空間,然後按一下 [管理]。 (或按一下 [存取控制命名空間]、選取 [命名空間],然後按一下 [管理])。
按一下 [規則群組],然後按一下與信賴憑證者應用程式相關聯的規則群組。
-
警告
下列步驟無法復原。 不過,如果您刪除了產生的規則,您可以輕易地重新產生這些規則。
在 [編輯規則群組] 頁面上,選取 [規則] 區段中的所有規則,然後按一下 [刪除選取的規則]。
按一下 [檔案] 。
返回您的網站,並使用您的瀏覽器瀏覽至其中一個頁面。
您應該重新導向至您的身分識別提供者以進行驗證,Windows Live ID (Microsoft 帳戶) 、Google、Facebook、Yahoo!或 —任何為信賴憑證者設定為身分識別提供者的專案。
成功驗證之後,您應該重新導向回 ACS,這應該會產生錯誤,因為未定義任何規則。
此錯誤應該會顯示在您在步驟 2 – 建立錯誤協助程式類別中建立的錯誤頁面上,而且如下所示:
uri:WindowsLiveID 錯誤碼 ACS50000:發出權杖時發生錯誤。
另一種測試方式是拒絕使用者同意。 這會在您使用 Facebook 或 Google 登入時顯示。