Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要一种安全的方法来绕过公共方法中的许可证检查条件_C#_Sharepoint - Fatal编程技术网

C# 需要一种安全的方法来绕过公共方法中的许可证检查条件

C# 需要一种安全的方法来绕过公共方法中的许可证检查条件,c#,sharepoint,C#,Sharepoint,我有两个产品A和B。A是付费工具,B是免费工具。B使用A的某个dll。现在我有一个方法说 public void licenseCheck(bool test){....} 此方法包含一个条件,如果您没有“获取许可证”,则会发出警报“获取许可证”。现在,从产品B类中的一个,出于某种原因,我必须调用licenseCheck方法,因为B是免费的,您不需要许可证,所以它仍然会给出“get license”错误 我尝试过更改方法的签名 licenseCheck( bool test, bool b

我有两个产品A和B。A是付费工具,B是免费工具。B使用A的某个dll。现在我有一个方法说

 public void licenseCheck(bool test){....} 
此方法包含一个条件,如果您没有“获取许可证”,则会发出警报“获取许可证”。现在,从产品B类中的一个,出于某种原因,我必须调用licenseCheck方法,因为B是免费的,您不需要许可证,所以它仍然会给出“get license”错误

我尝试过更改方法的签名

licenseCheck( bool test, bool byPasslicense = false)
并使用byPasslicense变量绕过许可证检查的条件。我给了它默认值,因为这种方法在很多地方都使用。 这种方法存在一些安全问题,因为这些DLL用于许多其他需要许可的付费产品。有些人只需调用此方法,并将“true”值传递给licenseCheck方法的byPasslicense参数。我不想那样。我只想绕过产品B

注:
这是一个已完成的项目,我不能仅仅改变整个方法,我只需要绕过licenseCheck方法中负责许可证检查的条件。

在我看来,您打破了SOLID原则中的S,因为方法
getLicense
不仅仅是检查许可证,否则如果希望它不检查许可证,就不需要调用它

下面是你应该如何解决这个问题

  • 通过将
    getLicense
    方法的一部分提取到新方法中,将该方法拆分为两个(至少)。将实际检查许可证的部分保留在原始方法中,并将其余部分拆分为新方法。将此新方法设置为内部
  • 将此属性添加到项目中:
    [程序集:InternalsVisibleTo(“B”)]
  • 从B调用新方法,而不是
    getLicense
    ,从而绕过许可证检查
  • 请注意,
    internal
    方法只能从同一个程序集(在本例中为A)中访问,而在本例中,只能从A明确表示内部构件对其可见的程序集(如本例中为B)中访问。第三方开发者将无法直接访问该方法


    例子 原始类别:

    public class Dohickey
    {
        public void getLicense(bool hasLicense)
        {
            if (!hasLicense) throw new Exception("Ewups");
            SetSomethingThatOtherCodeDependsOn();
            SetSomethingElseAsWell();
        }
    }
    
    修复后:

    [assembly: InternalsVisibleTo("B")]
    // ...
    public class Dohickey
    {
        public void getLicense(bool hasLicense)
        {
            if (!hasLicense) throw new Exception("Ewups");
            SetThings();
        }
    
        internal void SetThings()
        {
            SetSomethingThatOtherCodeDependsOn();
            SetSomethingElseAsWell();
        }
    }
    

    在我看来,您已经打破了SOLID原则中的S,因为方法
    getLicense
    不仅仅是检查许可证,否则如果希望它不检查许可证,就不需要调用它

    下面是你应该如何解决这个问题

  • 通过将
    getLicense
    方法的一部分提取到新方法中,将该方法拆分为两个(至少)。将实际检查许可证的部分保留在原始方法中,并将其余部分拆分为新方法。将此新方法设置为内部
  • 将此属性添加到项目中:
    [程序集:InternalsVisibleTo(“B”)]
  • 从B调用新方法,而不是
    getLicense
    ,从而绕过许可证检查
  • 请注意,
    internal
    方法只能从同一个程序集(在本例中为A)中访问,而在本例中,只能从A明确表示内部构件对其可见的程序集(如本例中为B)中访问。第三方开发者将无法直接访问该方法


    例子 原始类别:

    public class Dohickey
    {
        public void getLicense(bool hasLicense)
        {
            if (!hasLicense) throw new Exception("Ewups");
            SetSomethingThatOtherCodeDependsOn();
            SetSomethingElseAsWell();
        }
    }
    
    修复后:

    [assembly: InternalsVisibleTo("B")]
    // ...
    public class Dohickey
    {
        public void getLicense(bool hasLicense)
        {
            if (!hasLicense) throw new Exception("Ewups");
            SetThings();
        }
    
        internal void SetThings()
        {
            SetSomethingThatOtherCodeDependsOn();
            SetSomethingElseAsWell();
        }
    }
    

    您在这里提到的原因是什么:“现在,出于某种原因,从产品B类中的一个,我必须调用licenseCheck方法”??这可能是你问题的根源。如果B是免费的,为什么你要为执照检查而烦恼呢?也许你有一个“免费”的许可证,你应该使用它?所以。。。。您有一个完整的方法,似乎专门用于许可证检查。您是从其他地方调用它,但在您实际上不希望检查许可证的情况下。。。你显然可以编辑那个呼叫网站。。。那么,为什么它仍然需要调用函数呢?为什么需要从不需要许可证的程序集检查许可证呢?您正在专门调用具有1个作业的方法,即检查许可证,但不希望检查许可证?请澄清你为什么需要这样做。嗨,对不起。我混淆了一些细节。该方法用于连接到特定的sharepoint网站,然后获取该网站的详细信息。因此,当您尝试连接到站点时,它会执行许可证检查。因此,简而言之,在我的所有产品A或B中,我需要尝试连接到sharepoint网站。当我使用A连接到站点时,它应该执行许可证检查;当我使用B时,它不应该执行许可证检查。希望这对我来说是个糟糕的设计,来电者可以决定是否进行许可证检查。您的问题本质上是SharePoint授权的问题,所以为什么不使用调用产品的凭据来确定是否执行许可证检查?您在这里提到的原因是什么:“现在,由于某种原因,我必须从产品B类中的一个调用licenseCheck方法”??这可能是你问题的根源。如果B是免费的,为什么你要为执照检查而烦恼呢?也许你有一个“免费”的许可证,你应该使用它?所以。。。。您有一个完整的方法,似乎专门用于许可证检查。您是从其他地方调用它,但在您实际上不希望检查许可证的情况下。。。你显然可以编辑那个呼叫网站。。。那么,为什么它仍然需要调用函数呢?为什么需要从不需要许可证的程序集检查许可证呢?您正在专门调用具有1个作业的方法,即检查许可证,但不希望检查许可证?请澄清你为什么需要这样做。嗨,对不起。我混淆了一些细节。该方法用于连接到特定的sharepoint网站,然后获取该网站的详细信息。所以它执行许可证检查