Enterprise Library 2.0 -- Security Application Block

转载 2006年06月21日 14:46:00
今天来介绍一下Enterprise Library 2.0中的Security Application Block ,它可以帮助程序开发者在应用程序中实现与授权有关的大部分功能,不仅如此,它还支持缓存我们系统中用户的授权以及,授权数据。主要包括一下几个部分的功能:
1、减少代码编写量;
2、保持应用程序中安全管理的一致性;
3、提供了应用程序中很多安全问题的实现方法;
4、可扩展,支持自定义Provider。
...

       关于Security Application Block的介绍部分,我不再多说,具体可以参考帮助文档。下面我们来看一下如何配置Security Application Block,首先打开配置工具,新建一个Security Application Block,如下:


然后在Authorization节点下创建一个Authorization Rule Provider,名称为RuleProvider,如下:



现在就可以在RuleProvider节点下,创建一系列的规则(Rule)了。如下图:



新建了规则,我们还需要为这个规则定义一个表达式,用于在程序中判断是否满足该规则,如下图:



如图所示,我们定义了能通过该规则的用户的身份必须是User或Admin.我们可以根据我们的实际需要定义各种各样的规则。
最后我们可以为我们建立的Security Application Block分配一个默认的Authorization实例,如图:


此时,我们的配置文件中就多了如下内容:

<section name="securityConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Security.Configuration.SecuritySettings, Microsoft.Practices.EnterpriseLibrary.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />

<securityConfiguration defaultAuthorizationInstance="RuleProvider"
    defaultSecurityCacheInstance
="">
    
<authorizationProviders>
      
<add type="Microsoft.Practices.EnterpriseLibrary.Security.AuthorizationRuleProvider, Microsoft.Practices.EnterpriseLibrary.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        name
="RuleProvider">
        
<rules>
          
<add expression="R:User OR R:Admin" name="Rule" />
        
</rules>
      
</add>
    
</authorizationProviders>
  
</securityConfiguration>

       关于Security Application Block的配置就说到这里。

      下面来看看Enterprise Library 2.0 的Security Application Block 与1.0版本中的一点区别,因为ASP.NET2.0中提供了角色与成员管理的新特性,所以在某些方面和1.0版本还是有一定的区别:
    因为ASP.NET2.0提供了MemberShip,Roles两个类,其中包含了验证用户、角色管理以及对Profile信息的设置与读取功能,所以Security Application Block 2.0将这些功能去掉了。因此和1.0版本的主要区别在于下面三方面:

首先导入下面两个命名空间:
using System.Web.Profile;
using System.Web.Security;

1、验证用户的方法如下:

        /// <summary>
        
/// 验证用户
        
/// http://pw.cnblogs.com
        
/// </summary>
        
/// <param name="username">用户名</param>
        
/// <param name="password">密码</param>
        
/// <returns></returns>

        public bool CheckUser(string username, string password)
        
{
            
return Membership.ValidateUser(username, password);
        }

2、读取或设置Profile信息

        /// <summary>
        
/// 使用 Profile
        
/// http://pw.cnblogs.com
        
/// </summary>

        [TestMethod]
        
public void UseProfile()
        
{
            IIdentity identity;
            identity 
= new GenericIdentity("SHY520", Membership.Provider.Name);

            
//设置Profile
            ProfileBase setuserProfile = ProfileBase.Create(identity.Name);

            setuserProfile[
"Name"= "SHY520";
            setuserProfile[
"Address"= "Wuhu China";
            
//保存Profile信息
            setuserProfile.Save();

            
//读取Profile信息
            ProfileBase readuserProfile = ProfileBase.Create(identity.Name);

            
string Name = readuserProfile["Name"].ToString();
            
string Address = readuserProfile["Address"].ToString();

            Assert.AreEqual(Name,
"SHY520");
            Assert.AreEqual(Address,
"Wuhu China");
        }

3、得到某个用户所属角色列表

        /// <summary>
        
/// 得到某用户所属角色列表
        
/// http://pw.cnblogs.com
        
/// </summary>
        
/// <returns>角色列表</returns>

        public string[] GetUserRoles()
        
{
            IIdentity identity 
= new GenericIdentity("SHY520", Membership.Provider.Name);

            
return Roles.GetRolesForUser(identity.Name);

        }

      与上一个版本的区别基本上就是以上几点,下面我们来看看Security Application Block2.0的基本使用方法:

1、为已授权的用户分配一个Token(记号):
       Security Application Block将授权用户的身份信息放进缓存,并返回一个Token,所以我们在使用此方之前需要先配置一个Security Cache,具体方法我就不多说了,可以参考官方教程,下面贴出配置后的App.Config中的代码:

<securityCacheProviders>
      
<add cacheManagerInstanceName="Cache Manager" defaultSlidingSessionExpirationInMinutes="10"
        defaultAbsoluteSessionExpirationInMinutes
="60" type="Microsoft.Practices.EnterpriseLibrary.Security.Cache.CachingStore.CachingStoreProvider, Microsoft.Practices.EnterpriseLibrary.Security.Cache.CachingStore, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        name
="Caching Store Provider" />
</securityCacheProviders>

这段代码是在securityConfiguration节中的,其中cacheManagerInstanceName是我们在Caching Application Block中配置的实例。

        /// <summary>
        
/// 使用SaveIdentity方法,保存用户身份,并返回一个Token
        
/// http://pw.cnblogs.com
        
/// </summary>
        
/// <returns></returns>

        public IToken SaveUserInfo()
        
{
            ISecurityCacheProvider sc 
= SecurityCacheFactory.GetSecurityCacheProvider("Cache Manager");

            
//将用户身份装入缓存,并返回一个IToken类型的记号
            return sc.SaveIdentity(new GenericIdentity("SHY520"));
        }

2、使用Token来验证用户是否已被授权

        /// <summary>
        
/// 根据Token来判断用户是否已被授权
        
/// http://pw.cnblogs.com
        
/// </summary>
        
/// <param name="token"></param>
        
/// <returns></returns>

        public bool CheckUserByToken(IToken token)
        
{
            ISecurityCacheProvider sc 
= SecurityCacheFactory.GetSecurityCacheProvider("Cache Manager");

            
//得到Token对应的身份IIdentity
            IIdentity savedIdentity = sc.GetIdentity(token);
            
//返回该身份是否已被授权
            return savedIdentity.IsAuthenticated;
            
        }
   

3、结束User Session(即使Token过期)

        /// <summary>
        
/// 使用户Token过期
        
/// http://pw.cnblogs.com
        
/// </summary>

        public void CloseUserSession()
        
{
            ISecurityCacheProvider sc 
= SecurityCacheFactory.GetSecurityCacheProvider("Cache Manager");
            
//保存身份
            IToken token = sc.SaveIdentity(new GenericIdentity("SHY520"));
            
//使身份过期
            sc.ExpireIdentity(token);
        }

4、判断用户是否满足一定的规则
      首先需要导入下面的命名空间:
 using System.Security;
 using System.Security.Principal;
 using Microsoft.Practices.EnterpriseLibrary.Security;

    /// <summary>
        
/// 判断用户是否满足一定的规则
        
/// http://pw.cnblogs.com
        
/// </summary>
        
/// <param name="username">用户名称</param>
        
/// <param name="role">角色名称</param>
        
/// <param name="rule">规则名称</param>
        
/// <returns></returns>

        public bool CheckUserRoleByRule(string username, string role, string rule)
        
{
            IPrincipal principal 
= new GenericPrincipal(new GenericIdentity(username), new string[] { role });

            
//创建一个默认的Authorization实例
            IAuthorizationProvider autoprovider = AuthorizationFactory.GetAuthorizationProvider();

            
//返回验证是否通过
            return autoprovider.Authorize(principal, rule);
        }

通过上面的方法可以很简单的实现对用户权限的鉴定,关于Security Application Block的简单应用就说到这里,下面我们来看一下如何实现自定义的authorization provider。
1、首先我们建立自己的Provider类,该类需继承AuthorizationProvider;
2、并且要加上[ConfigurationElementType(typeof(CustomAuthorizationProviderData))]的Attribute;
3、添加构造函数,参数为NameValueCollection类型;
4、覆盖基类中的Authorize方法,在其中添加自己的验证是否授权的逻辑
这样就完成了一个自定义的authorization provider。
完整的类定义如下:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Security;
using System.Collections.Specialized;
using System.Security.Principal;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Security.Configuration;

namespace Enterprise_Library_2
{
    [ConfigurationElementType(
typeof(CustomAuthorizationProviderData))]
    
public class CustomProvider : AuthorizationProvider
    
{
        
public CustomProvider(NameValueCollection configurationItems)
        
{
            
        }


        
public override bool Authorize(IPrincipal principal, string context)
        
{
            
//TODO:在此处添加自己需要的验证授权的逻辑既可

            
return true;
        }


    }

}

关于Security Application Block的介绍就说到这里了,有疏忽错误的地方,还请指正,希望对初学者有所帮助!

相关文章推荐

C#日志扩展包之Microsoft Enterprise Library - Logging Application Block之配置

配置Logging Application Block可以使用两种方法:1、使用app.config文件配置,xml编辑器或Enterprise Library Configuration Tool;...

Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block

黄聪:Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许...

WCF后续之旅(8):通过WCF Extension 实现与MS Enterprise Library Policy Injection Application Block 的集成

WCF后续之旅(8):通过WCF Extension 实现与MS Enterprise Library Policy Injection Application Block 的集成 ...
  • cpcpc
  • cpcpc
  • 2011年01月18日 09:06
  • 494

Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block

企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演...

Microsoft Enterprise Library 企业库5.0----Cryptography Application Block (高级)

本章介绍的是企业库加密应用程序模块Cryptographyproviders中为对称加密配置Key文件的3种方式: create a new key  : 使用一串字符串作为Key,然后通过加密保存...

Microsoft Enterprise Library 5.0 系列(一) : Caching Application Block (初级)

本篇文章具体官方解释请参照以下链接: http://msdn.microsoft.com/en-us/library/ff664753%28v=PandP.50%29.aspx Microsof...
  • anyqu
  • anyqu
  • 2012年09月11日 13:25
  • 1043

Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block

企业库数据库访问模块通过抽象工厂模式,允许用户通过简单的配置选择不同的数据库作为程序的数据源,大大解决了切换数据库时带来的麻烦.因为我本机只安装了SQL Server 2005,所以在此只做SQL的演...
  • anyqu
  • anyqu
  • 2012年09月11日 13:47
  • 797

Microsoft Enterprise Library 5.0 之 Data Access Application Block

企业库数据库访问模块的几大功能: 1.        最简单的功能,通过ExecuteNonQuery.方法执行SQL语句. 2.        执行ExecuteDataSet,返回Da...

Microsoft Enterprise Library 5.0 系列(九) Policy Injection Application Block

代理对象(Proxy Object)会通过Handler链定位到真实对象(Real Object),而Policy则被注入到代理对象和真实对象中。整个流程如图:   我个人对Policy ...
  • anyqu
  • anyqu
  • 2012年09月11日 13:52
  • 739

Microsoft Enterprise Library 5.0 系列(七) Exception Handling Application Block

使用企业库异常处理应用程序模块的优势: 它支持整个应用程序体系结构层的异常处理,而不仅限于服务接口的界限。 它使得异常处理策略可以在管理层定义和维护,以便决策人员(可能是系统管理员和开发人员)可...
  • anyqu
  • anyqu
  • 2012年09月11日 13:50
  • 1399
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Enterprise Library 2.0 -- Security Application Block
举报原因:
原因补充:

(最多只允许输入30个字)