此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
导出 (0) 打印
全部展开
展开 最小化

操作方法:在声明感知 ASP.NET 应用程序中使用 WIF 和 ACS 实施基于角色的访问控制 (RBAC)

发布时间: 2011年4月

更新时间: 2015年6月

应用到: Azure

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

  • Windows® Identity Foundation (WIF)

  • ASP.NET

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

  • 目标

  • 概述

  • 步骤摘要

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

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

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

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

  • 步骤 5 – 测试你的工作

  • 相关项目

  • 使用 ACS 配置角色声明。

  • 使用 ClaimsAuthenticationManager 转换角色声明。

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

RBAC 是在应用程序中广泛采用的限制访问权限的方式。在 ASP.NET Web 应用程序中,此方式是使用自 ASP.NET 1.0 便已推出的 IsInRole 方法、PrincipalPermission 属性或请求来实施的。你可以使用声明来完成授权,这样既保留了成熟的做法,又能使用 WIF 和 ACS 等新技术。可从以下网页下载 WIF 运行时和 SDK:

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

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

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

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

  • 步骤 5 – 测试你的工作

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

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

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

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

此步骤说明如何在 ACS 管理门户中使用规则组配置角色声明。有关完整的分步演练,请参阅操作方法:使用规则实现令牌转换逻辑

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

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

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

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

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

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

此步骤说明如何实施 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.");
            }
        }
    }
    
    

这是一个可选步骤。此步骤说明如何使用 ClaimsAuthenticationManager(它是在 ASP.NET 应用程序的上下文中运行的 WIF 管道的组成部分)转换声明,这种转换方式与 ACS 上运行的声明转换规则(如步骤 2 – 在 ACS 中配置角色声明中所述)不同。

  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 文件夹中。

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

社区附加资源

添加
显示:
© 2015 Microsoft