本文档已存档,并且将不进行维护。

操作方法:使用错误 URL 进行自定义错误处理

发布时间: 2011年4月

更新时间: 2015年6月

应用到: Azure

  • Microsoft Azure Active Directory 访问控制(也称为访问控制服务或 ACS)

本主题说明如何使用错误 URL 功能在信赖方应用程序中实现自定义错误处理。错误 URL 用于将 ACS 生成的错误发回到信赖方应用程序,以便后者可以记录和响应错误。例如,ASP.NET 网站可以使用错误 URL 功能向最终用户呈现外观与网站一致的错误消息。

  • 目标

  • 概述

  • 步骤摘要

  • 步骤 1 – 启用错误 URL 功能

  • 步骤 2 – 创建 Error 帮助器类

  • 步骤 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 – 创建 Error 帮助器类

  • 步骤 3 – 处理 JSON 编码的错误消息

  • 步骤 4 – 配置对错误页的匿名访问

  • 步骤 5 – 测试你的工作

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

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

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

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

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

此步骤创建用于反序列化 JSON 编码的错误消息的 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 的错误消息时,将用到这些类。

此步骤说明如何处理由 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 编码的错误消息。

此步骤配置对 ErrorPage.aspx 页的匿名访问。如果该页面受保护并且需要授权,则结果将会是无限重定向循环。如果是这种情况,那么当 ACS 尝试访问此页面时,ACS 将会发送 JSON 编码的错误。

note备注
由于错误页可以匿名访问并且它可能包含回显 HTML 和/或将数据写入数据库的代码,因此你应该确保防止跨站点脚本和 SQL 注入式攻击。以下资源详细描述了这种情况:

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

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

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

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

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

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

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

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

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

  6. 单击“保存”

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

  8. 你应该会被重定向到为信赖方配置的任何标识提供程序进行身份验证 - Windows Live ID(Microsoft 帐户)、Google、Facebook、Yahoo! 或 。

  9. 在成功进行身份验证之后,你应该会被重定向回 ACS,由于未定义任何规则,因此会生成一个错误。

  10. 此错误应显示在你在步骤 2 – 创建 Error 帮助器类中创建的错误页上,如下所示:

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

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

显示: