如何:使用 WIF 和 ACS 在声明感知 ASP.NET 应用程序中实现基于角色访问控制 (RBAC)

更新时间:2015 年 6 月 19 日

适用于:Azure

应用于

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

  • Windows® Identity Foundation (WIF)

  • ASP.NET

总结

本主题介绍如何使用 WIF 和 ACS 在声明感知 ASP.NET Web 应用程序中实现基于角色的 RBAC 访问控制 (RBAC) 授权。

目录

  • 目标

  • 概述

  • 步骤摘要

  • 步骤 1 – 创建一个简单的声明感知 ASP.NET Web 应用程序

  • 步骤 2 – 在 ACS 中配置角色声明

  • 步骤 3 – 在 ASP.NET Web 应用程序中实施角色检查

  • 步骤 4 – 使用自定义 ClaimsAuthenticationManager 实施声明转换

  • 步骤 5 - 测试你的工作

  • 相关项

目标

  • 使用 ACS 配置角色声明。

  • 使用 ClaimsAuthenticationManager 转换角色声明。

  • 使用 IsInRole 方法和 PrinciaplPermission 属性实现基于角色的访问控制检查。

概述

RBAC 是在应用程序中广泛采用的限制访问权限的方式。 在 ASP.NET Web 应用程序中,此方法是使用 IsInRole 方法、PrincipalPermission 属性或需求实现的,自 ASP.NET 1.0 以来提供。 可以使用声明进行授权,从而在使用 WIF 和 ACS 等新技术的同时保留成熟的做法。 可从以下网页下载 WIF 运行时和 SDK:

步骤摘要

  • 步骤 1 – 创建一个简单的声明感知 ASP.NET Web 应用程序

  • 步骤 2 – 在 ACS 中配置角色声明

  • 步骤 3 – 在 ASP.NET Web 应用程序中实施角色检查

  • 步骤 4 – 使用自定义 ClaimsAuthenticationManager 实施声明转换

  • 步骤 5 - 测试你的工作

步骤 1 – 创建一个简单的声明感知 ASP.NET Web 应用程序

此步骤说明如何创建一个基本的 ASP.NET Web 应用程序,该应用程序将用作实施 RBAC 的基准。

创建一个简单的 ASP.NET Web 应用程序

  1. 使用“以管理员身份运行”选项启动 Visual Studio。 操作 WIF 时必须使用此选项。

  2. 创建一个新的 ASP.NET 空 Web 应用程序。

  3. 添加 aspx Web 窗体,并为其命名,例如将其命名为 default.aspx。

步骤 2 – 在 ACS 中配置角色声明

此步骤演示如何使用规则组在 ACS 管理门户中配置角色声明。 有关如何 :使用规则实现令牌转换逻辑 ,了解完整的分步演练。

在 ACS 管理门户中配置角色声明

  1. 在“编辑信赖方应用程序”页上,向下滚动至“规则组”部分,然后单击所需组的链接。 请确保选择该链接。

  2. 在“编辑规则组”页上,向下滚动至“规则”部分,然后单击“添加规则”链接

  3. 在“添加声明规则”页上,向下滚动至“输出声明类型”部分,单击“选择类型”单选按钮,然后选择以下声明类型

    https://schemas.microsoft.com/ws/2008/06/identity/claims/role
    
  4. 在“ 输出声明值 ”部分中,单击 Enter 值,然后在文本框中输入以下文本作为值:
    用户

  5. 有选择地添加说明,然后单击“保存”(建议的操作)。

你刚刚配置了可被添加到任何令牌的 User 角色声明。 该方案根据你的要求可能会有所不同。 有关配置更复杂的规则的详细信息,请参阅 如何:使用规则实现令牌转换逻辑

步骤 3 – 在 ASP.NET Web 应用程序中实施角色检查

此步骤说明如何实施 RBAC。

在 ASP.NET 网页中实施 RBAC

  1. 添加对 Microsoft.IdentityModel 程序集的引用。

  2. 打开代码隐藏文件 default.aspx.cs。

  3. 添加以下 using 声明。

    using System.Security.Permissions;
    using System.Threading;
    using Microsoft.IdentityModel.Claims;
    using System.Security;
    
  4. 使用以下安全请求修饰 Page_Load 事件处理程序。 此属性将检查当前用户是否充当 User 角色。 如果不是,将会引发异常。

    [PrincipalPermission(SecurityAction.Demand, Role = "User")]
    
  5. 将以下代码添加到 Page_Load 事件处理程序的正文。 这与代码中表示的请求完全相同。

    PrincipalPermission p = new PrincipalPermission(null, "User");
       p.Demand();
    
  6. 将以下代码添加到 Page_Load 事件的正文。 与前一代码相反,此代码不会引发异常。 IsInRole 返回布尔值,指示当前用户是否充当特定的角色。

    if (!User.IsInRole("User"))
                    throw new SecurityException("Access is denied.");
    
  7. 完整的代码应该类似于:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    using System.Security.Permissions;
    using System.Threading;
    using Microsoft.IdentityModel.Claims;
    using System.Security;
    
    namespace WebIsInRoleACS
    {
        public partial class _default : System.Web.UI.Page
        {
            //THIS SHOULD THROW AN EXCEPTION
            [PrincipalPermission(SecurityAction.Demand, Role = "User")]
            protected void Page_Load(object sender, EventArgs e)
            {
    
                //THIS SHOULD THROW AN EXCEPTION
                PrincipalPermission p = new PrincipalPermission(null, "User");
                p.Demand();
    
                //THIS RETURNS BOOL
                if (!User.IsInRole("User"))
                    throw new SecurityException("Access is denied.");
            }
        }
    }
    

步骤 4 – 使用自定义 ClaimsAuthenticationManager 实施声明转换

这是可选步骤。 此步骤演示如何使用 ClaimsAuthenticationManager(这是在 ASP.NET 应用程序上下文中运行的 WIF 管道的一部分)来转换声明,而不是在 ACS 上运行的声明转换规则,如步骤 2 - 在 ACS 中配置角色声明。

使用自定义 ClaimsAuthenticationManager 实施声明转换

  1. 向 Visual Studio 解决方案添加“类库”项目,并为该项目命名,例如命名为 MyClaimsTransformationModule

  2. 添加对 Microsoft.IdentityModel 程序集的引用。

  3. 添加对 System.IdentityModel 程序集的引用。

  4. 创建一个新类并为其命名,例如 ClaimsTransformationModule。

  5. 将以下声明添加到该类。

    using Microsoft.IdentityModel.Claims;
    using System.Security.Principal;
    
  6. ClaimsAuthenticationManager 类型派生该类。

  7. 覆盖其 Authenticate 方法(将在此方法中发生声明转换)。 可基于以下代码编写 Authenticate 方法的代码。

    if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true)
    {
        //DECIDE ON SOME CRITERIA IF CURRENT USER DESERVES THE ROLE
        //IClaimsIdentity identity = (IClaimsIdentity)incomingPrincipal.Identity;
        ((IClaimsIdentity)incomingPrincipal.Identity).Claims.Add(
            new Claim(ClaimTypes.Role, "Admin"));
    }
    return incomingPrincipal;
    
  8. 切换到 ASP.NET 应用程序,并在其 web.config 中配置你的自定义 ClaimsAuthenticationManager。

      <microsoft.identityModel>
        <service>
          <claimsAuthenticationManager type="MyClaimsTransformationModule.ClaimsTransformationModule, MyClaimsTransformationModule" />
    
  9. 确保应用程序能够找到你创建的新程序集;最简单的方法是将其放入应用程序的 bin 文件夹中。

步骤 5 - 测试你的工作

此步骤说明如何验证该解决方案是否正常工作。 若要测试你的解决方案,请按 F5 键。 你的 ASP.NET Web 应用程序应在调试模式下运行(你可以在 Visual Studio 中添加断点以验证代码执行情况)。 首先,系统应会将你转到针对联合身份验证配置的标识提供程序的身份验证页。 完成身份验证后,系统应将你重定向回到 Default.aspx 页,并且不会引发异常,这意味着,已可以满足 User 角色的所有安全请求。