使用.NetTiers的安全应用程序块

源文链接:http://nettiers.com/SecurityBlockUsage.ashx

 

.NetTiers中已经集成了Enterprise Library的安全应用程序块。只需要您做很少的一些额外步骤就能让它们工作。

首先,.NetTiers的Service层的类中的每个方法都会检查当前用户是否有权限执行自身(该方法),如下所示:
//若检查结果为“当前用户未被授权”,则会抛出security exception
SecurityContext.IsAuthorized("GetAll");

 

这些方法通过调用安全上下文类的IsAuthorized方法获得判断结果。背后,IsAuthorized方法通过Enterprise Library应用程序块根据配置文件中的Rule设定判断“当前用户是否有权限”。规则名由“实体类名+访问的方法名”组成,在此示例中即“Customer.GetAll”。所以在安全应用程序块的XML配置文件中,若当前用户在对应规则的用户列表(expression属性)中存在的话,就能获得授权,否则只能被抛出异常。


为了让它们能够正确地工作,您需要将Microsoft.Practices.EnterpriseLibrary.Security.Cache.CachingStore.CachingStoreProvider.dll这个文件(在您的Microsoft Enterprise Library目录的bin目录中)拷贝至您的References目录(在项目解决方案目录中),然后将此引用加入至您的项目中。
现在,打开您的web.config文件,找到”.Data“配置节,展开”Provider“节点,将”enableMethodAuthorization“属性值设为”true“。

 

若此刻运行您的网站项目,您会发现不管做什么操作都会被抛出异常,如”Authorization rule Customer.GetAll not found in configuration“。为了解决这个问题,我们需要在”安全应用程序块“的XML配置文件中将规则配置进去,并且您需要为每个方法都配置一条规则。您可以使用Enterprise Library Configurator工具进行配置,也可以手动在配置文件中进行配置。打开entlib.config配置文件,找到以下配置节:
<rules>
<add expression="I:? OR R:Guest" name="AnonymousRule" />
</rules>

然后将规则加入此列表,以下是规则示例,”Customer“是示例实体名,请根据实际的实体名进行替换:
<add name="Customer.GetByCustomerId" expression="R:Readers" />
<add name="Customer.GetAll" expression="R:Readers" />
<add name="Customer.GetPaged" expression="R:Readers" />
<add name="Customer.Find" expression="R:Readers" />
<add name="Customer.DeepLoadByCustomerId" expression="R:Readers" />
<add name="Customer.DeepLoad" expression="R:Readers" />
<add name="Customer.DeepSave" expression="R:Writers" />
<add name="Customer.Insert" expression="R:Writers" />
<add name="Customer.Update" expression="R:Writers" />
<add name="Customer.Save" expression="R:Writers" />
<add name="Customer.Delete" expression="R:Writers" />


在此示例中,”Readers“角色的成员能够执行所有的”Get“操作,”Writers“角色的成员能够创建和更新记录。若您使用的的是”Windows验证模式“,这些角色就是些简单的活动目录组。
这些做完了之后,异常就应该不会再被抛出。但是2.2.0.559版本的.NetTiers需要做一些修改后才能正确的工作:修改SecurityContext类中的IsAuthorized方法(在”Services“项目中):
/// <summary>
/// 若当前用户未被授权,则抛出一个异常
/// </summary>

public void IsAuthorized(string ruleToCheck)
{
 if (ConnectionScope.Current.DataProvider.EnableMethodAuthorization)
 {
  if (!RuleProvider.Authorize(Principal, string.Format("{0}.{1}", typeof(Entity).Name, ruleToCheck) ))
     throw new SecurityException(string.Format("User '{0}' does not have permission to perform rule '{1}'",
       Principal.Identity.Name, string.Format("{0}.{1}", typeof(Entity).Name, ruleToCheck) ));
 }
}

 

您也可以直接更改.NetTiers的template文件,这样就不用每次使用.NetTiers生成应用程序框架后都去修改IsAuthorized方法。


现在每当某用户尝试去做某事,当他未获得相应的极限时(在配置文件的规则中进行指定),一个”安全异常“将会被抛出(您可以在global.asax文件中捕获这个异常,而给用户一个友好的错误信息)。

posted @ 2010-06-30 12:11  beta2013  阅读(143)  评论(0编辑  收藏  举报