0

アセンブリだけがこれらのメンバーをリモートで呼び出すようにするために、.NET リモート処理を介して実装する必要がある内部インターフェイスがありました (InternalsVisibleTo を使用して、フレンド アセンブリへのアクセスを許可しました)。ただし、インターフェイスを実装してビルドすると、次のエラーが発生しました。

'AssemblyName' does not implement interface member 'InterfaceMember1(...)' 'AssemblyName' cannot implement an interface because it is not public. 

これを機能させる方法を検索して見つけることができませんでした。ただし、アセンブリをビルドできるようにするインターフェイスを明示的に実装したので、任意のフレンド アセンブリからリモート メソッドを問題なく呼び出すことができます。

ただし、このトピック、特に MSDN と StackOverflow に関する情報が不足していることを懸念しています。内部インターフェイスを介した .NET リモート処理の実装に問題はありますか? もしそうなら、なぜですか?

編集 これが私のインターフェースと実装の外観です:

インターフェース

internal interface IAdmin
{
    bool TESTPING();
    bool AdminTask1(int val);
    ...
}

実装

public class RService : MarshalByRefObject, IAdmin
{
    //IAdmin members

    bool IAdmin.TESTPING()
    {
        return true;
    }

    bool IAdmin.AdminTask1(int val)
    {
        // do stuff
        return true;
    }
}
4

2 に答える 2

1

そのようにセキュリティ機能を実装することはできません。Remoting の仕様はオープンであるため、誰でもメッセージを作成し、リモート クラスに送信して応答を受け取ることができます。あなたのサービスは、誰がそれを呼び出したかを確実に特定することはできません。

カスタム承認を実装し、各メソッド呼び出しでシークレット トークンを送信して、コードだけがそれを呼び出すようにすることができます。

于 2013-04-15T11:37:35.340 に答える
1

MSDN: http://msdn.microsoft.com/en-us/library/ms182313(VS.80).aspx

インターフェイス メソッドにはパブリック アクセシビリティがあり、実装する型によって変更することはできません。内部インターフェイスは、インターフェイスを定義するアセンブリの外部で実装されることを意図していないコントラクトを作成します。virtual 修飾子を使用して内部インターフェイスのメソッドを実装するパブリック型では、アセンブリの外部にある派生型によってメソッドをオーバーライドできます。定義アセンブリ内の 2 番目の型がメソッドを呼び出し、内部のみのコントラクトを想定している場合、代わりに外部アセンブリ内のオーバーライドされたメソッドが実行されると、動作が損なわれる可能性があります。これにより、セキュリティ上の脆弱性が生じます。

于 2013-04-15T11:37:08.030 に答える