如何:对自定义错误处理使用错误 URL
更新时间:2015 年 6 月 19 日
适用于:Azure
应用于
- Microsoft Azure Active Directory 访问控制(也称为访问控制服务或 ACS)
总结
本主题说明如何使用错误 URL 功能在信赖方应用程序中实现自定义错误处理。 使用错误 URL 可将 ACS 生成的错误发送回信赖方应用程序,以便应用程序可以记录和响应错误。 例如,ASP.NET 网站可以使用错误 URL 功能向最终用户呈现外观与网站一致的错误消息。
目录
目标
概述
步骤摘要
步骤 1 – 启用错误 URL 功能
步骤 2 – 创建 Error 帮助器类
步骤 3 – 处理 JSON 编码的错误消息
步骤 4 – 配置对错误页的匿名访问
步骤 5 - 测试你的工作
目标
识别使用错误 URL 功能所需的配置。
确定处理 ACS 错误消息所需的帮助程序代码。
识别并排查隐患。
概述
错误 URL 指定 ACS 在登录过程中发生错误时将用户重定向到的 Web 地址。 错误 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 – 创建 Error 帮助器类
步骤 3 – 处理 JSON 编码的错误消息
步骤 4 – 配置对错误页的匿名访问
步骤 5 - 测试你的工作
步骤 1 – 启用错误 URL 功能
对信赖方启用错误 URL 功能
转到Microsoft Azure管理门户 (https://manage.WindowsAzure.com) 登录,然后单击“Active Directory”。 (故障排除提示: “Active Directory”项缺失或不可用)
若要管理访问控制命名空间,请选择该命名空间,然后单击“管理”。 (或者,单击“访问控制命名空间”,选择命名空间,然后单击“管理”。)
单击“信赖方应用程序”,然后选择一个信赖方应用程序。
在“编辑信赖方应用程序”页上的“错误 URL”字段中,输入错误页 URL。
ACS 在发生登录错误时将用户重定向到此页面。 此外,ACS 还会将 JSON URL 编码参数发送到此页面,其中包含错误详细信息。
步骤 2 – 创建 Error 帮助器类
此步骤创建用于反序列化 JSON 编码的错误消息的 Error 帮助器类。
创建 Error 帮助器类
将一个类文件添加到你的 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 登录时,会呈现这种方法。