zoukankan      html  css  js  c++  java
  • 使用.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文件中捕获这个异常,而给用户一个友好的错误信息)。

  • 相关阅读:
    Android对包名和类名是否存在的判断
    Android权限表
    论艺术的背后还有纪律
    jeecgboot/IDEA中 debug不行,run可以
    java集合类
    HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
    protobuf序列化算法原理
    谁能帮我看看着究竟是什么问题呀,我在本机运行都是好好的,但在别人的机子上运行就出这个呢?我快疯了!!!
    VS删除空白行
    POJ 2516 Minimum Cost
  • 原文地址:https://www.cnblogs.com/beta2013/p/3377343.html
Copyright © 2011-2022 走看看