7

WCFサービスとnet.tcpエンドポイントを使用しており、serviceAuthenticationのプリンシパルPermissionModeがUseWindowsGroupsに設定されています。

現在、サービスの実装では、PrincipalPermission属性を使用して、各メソッドのロール要件を設定しています。

        [PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
        [OperationBehavior(Impersonation = ImpersonationOption.Required)]
        public string method1()

app.configでロールの構成を設定することを除いて、ほぼ同じことを実行しようとしています。これを実行し、Windowsグループ認証を引き続き使用する方法はありますか?

ありがとう

4

3 に答える 3

8

IISでWCFサービスをホストしている場合、ASP.NETワーカープロセスで実行されます。つまり、ASMXWebサービスの場合と同じように認証と承認を構成できます。

<system.Web>
    <authentication mode="Windows"/>
    <authorization>
        <allow roles=".\Administrators"/>
        <deny users="*"/>
    </authorization>
</system.Web>

次に、IISでエンドポイントへの匿名アクセスを無効にし、代わりに Windows統合認証を有効にする必要があります。
IIS管理コンソールで、仮想ディレクトリの[プロパティ]ダイアログを表示してこれを行います。次に、[ディレクトリセキュリティ]タブにセキュリティ設定が表示されます。

もちろん、利用可能な通信チャネルはHTTPのみです。クライアントは、次の設定を使用して、トランスポートレベルでリクエストにWindowsIDを提供する必要があります。

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WindowsSecurity">
                <security mode="Transport">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://localhost/myservice"
                  binding="wsHttpBinding"
                  bindingConfiguration="WindowsSecurity"
                  contract="IMyService" />
     </client>
</system.serviceModel>

サービスエンドポイントがwsHttpBindingを使用している場合は、SSLをエンドポイントに追加する必要があることに注意してください。これは、トランスポートレベルのセキュリティを使用するときにWCFによって適用される要件であるためです。
代わりにbasicHttpBindingを使用すると、SSLが不要になったTransportCredentialOnlyと呼ばれるWCFで利用可能な安全性の低い認証モードを使用できます。

詳細については、WCFのセキュリティインフラストラクチャの概要を以下に示します。

于 2008-11-14T10:21:12.723 に答える
4

Lars Wilhelmsen がこの問題の解決策を投稿しました。http://www.larswilhelmsen.com/2008/12/17/configurable-principalpermission-attribute/を ご覧ください。

于 2009-08-15T07:50:01.123 に答える
3

私がよく理解していれば、実行時に役割を選択したいと思うでしょう。これは、WCF 操作内のアクセス許可要求で行うことができます。例えば

public string method1()
{
    PrincipalPermission p = new PrincipalPermission(null, "Administrators");
    p.Demand();
    ...
于 2008-11-13T23:32:56.197 に答える