如何:对自定义错误处理使用错误 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 功能

  1. 转到Microsoft Azure管理门户 (https://manage.WindowsAzure.com) 登录,然后单击“Active Directory”。 (故障排除提示: “Active Directory”项缺失或不可用)

  2. 若要管理访问控制命名空间,请选择该命名空间,然后单击“管理”。 (或者,单击“访问控制命名空间”,选择命名空间,然后单击“管理”。)

  3. 单击“信赖方应用程序”,然后选择一个信赖方应用程序。

  4. 在“编辑信赖方应用程序”页上的“错误 URL”字段中,输入错误页 URL。

    ACS 在发生登录错误时将用户重定向到此页面。 此外,ACS 还会将 JSON URL 编码参数发送到此页面,其中包含错误详细信息。

步骤 2 – 创建 Error 帮助器类

此步骤创建用于反序列化 JSON 编码的错误消息的 Error 帮助器类。

创建 Error 帮助器类

  1. 将一个类文件添加到你的 Web 应用程序并为其指定名称,例如 Error.cs

  2. 按如下所示实现 Error 类。

    public class Error
    {
        public string errorCode { get; set; }
        public string errorMessage { get; set; }
    }
    

    添加另一个类文件并为其命名,例如 ErrorDetails.cs

  3. 按如下所示实现 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 编码的错误消息

  1. 将一个 ASPX 网页添加到你的 ASP.NET 应用程序并为其指定名称,例如 ErrorPage.aspx

  2. 将下列标签控件添加到 ASP.NET 标记。

    <asp:Label ID="lblIdntityProvider" runat="server"></asp:Label> 
    <asp:Label ID="lblErrorMessage" runat="server"></asp:Label> 
    
  3. 切换到页面的代码隐藏文件 ErrorPge.aspx.cs。

  4. 在顶部添加以下声明。

    using System.Web.Script.Serialization;
    
  5. 将下列代码添加到 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 注入式攻击。 以下资源详细描述了这种情况:

配置对错误页的匿名访问

  • 在应用程序中打开 web.config,并添加以下条目。

    <location path="ErrorPage.aspx">
      <system.web>
        <authorization>
          <allow users="*" />
        </authorization>
      </system.web>
    </location>
    

    这将确保你的页面不会导致无限重定向循环。

步骤 5 - 测试你的工作

此步骤测试你的错误 URL 配置和实现。

对信赖方启用错误 URL 功能

  1. 转到Microsoft Azure管理门户 (https://manage.WindowsAzure.com) 登录,然后单击“Active Directory”。 (故障排除提示: “Active Directory”项缺失或不可用)

  2. 若要管理访问控制命名空间,请选择该命名空间,然后单击“管理”。 (或者,单击“访问控制命名空间”,选择命名空间,然后单击“管理”。)

  3. 单击“规则组”,然后单击与信赖方应用程序关联的规则组。

  4. 警告

    以下步骤无法撤消。 但是,如果你要删除生成的规则,也可以很容易地再次生成这些规则。

  5. 在“编辑规则组”页上的“规则”部分中选择所有规则,然后单击“删除选定的规则”

  6. 单击“ 保存”。

  7. 返回到你的网站并使用浏览器导航到其中一个页面。

  8. 应重定向到标识提供者进行身份验证,Windows Live ID (Microsoft 帐户) 、Google、Facebook、Yahoo!或为信赖方配置为标识提供者的任何内容。

  9. 成功身份验证后,应重定向回 ACS,这应生成错误,因为未定义任何规则。

  10. 此错误应显示在在步骤 2 - 创建错误帮助程序类中创建的错误页上,如下所示:

    uri:WindowsLiveID 错误代码 ACS50000:颁发令牌时出错。

另一种测试方法是拒绝用户同意。 当你使用 Facebook 或 Google 登录时,会呈现这种方法。