3

独自の IPrincipal 実装をインストールするために ServiceAuthorizationBehaviour に指定できるカスタム IAuthorisationPolicy を設定しようとしています。ここの指示に従い、NetNamedPipes バインディングを使用して自己ホストするときにこれが機能することを確認するテストを作成しました。

問題は、IIS でホストされているこれを使用しようとすると、Identities プロパティが IAuthorisationPolicy に渡される EvaluationContext に設定されていないことです (セルフホスティングの場合)。

以下は、私の構成ファイルからの抜粋です。

<customBinding>
        <binding name="AuthorisedBinaryHttpsBinding" receiveTimeout="00:03:00" sendTimeout="00:03:00">
          <security authenticationMode="UserNameOverTransport">
          </security>
          <binaryMessageEncoding>
          </binaryMessageEncoding>
          <httpsTransport />
        </binding>
      </customBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CommonServiceBehaviour">
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
                                    membershipProviderName="AdminSqlMembershipProvider"/>
          </serviceCredentials>
          <serviceMetadata httpGetEnabled="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

(コードを使用して ServiceAuthorisationBehavior を構成していることに注意してください。そのため、ここには表示されません)

Identities プロパティが渡されない理由がわかりませんか?

私の IAuthorisationPolicy は次のようになります。

public class PrincipalInstallingAuthorisationPolicy : IAuthorizationPolicy
{
    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    {
        var identity = GetClientIdentity(evaluationContext);
        if (identity == null)
        {
            return false;
        }
            // var groups = get groups
            var principal = new GenericPrincipal(identity, groups);
            evaluationContext.Properties["Principal"] = principal;


        return true;
    }      

    private IIdentity GetClientIdentity(EvaluationContext evaluationContext)
    {
        object obj;
        if (!evaluationContext.Properties.TryGetValue("Identities", out obj))
        {
            return null;
        }

        IList<IIdentity> identities = obj as IList<IIdentity>;
        if (identities == null || identities.Count <= 0)
        {
            return null;
        }

        return identities[0];
    }

    ...
 }
4

2 に答える 2

3

I was working on the same issue. It may be because you use HTTP. In my case it is okay with the IIS and TCP binding. When i changed it to the basicHttpBinding the identitiy stoped to be sent.

于 2011-06-08T13:19:49.650 に答える
1

確認すべきことの 1 つ - 本当に serviceAuthorization の principalPermissionMode を "Custom" に設定していますか (リンク先の記事に示されているように)。それはあなたの成功にとって非常に重要です。

<serviceAuthorization principalPermissionMode="Custom">

また、匿名ユーザーとしてサービスを呼び出している可能性はありますか? その場合、「null」ID を取得する可能性があります。

クライアント構成はどうですか?? どのようなバインディングを使用し、どのようなセキュリティ設定を使用していますか?

マルク

于 2009-09-03T13:47:25.393 に答える