3

我正在尝试设置一个自定义 IAuthorisationPolicy,我可以将其提供给 ServiceAuthorizationBehaviour 以安装我自己的 IPrincipal 实现。我已按照此处的说明进行操作,并编写了一个测试来验证这在使用 NetNamedPipes 绑定进行自托管时是否有效。

问题是,当我尝试在 IIS 下使用托管时,未在传递给我的 IAuthorisationPolicy 的评估上下文中设置 Identities 属性(而在自托管时是这样)。

以下是我的配置文件的摘录:

<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

我正在研究同样的问题。可能是因为您使用 HTTP。就我而言,IIS 和 TCP 绑定没问题。当我将其更改为 basicHttpBinding 时,身份停止发送。

于 2011-06-08T13:19:49.650 回答
1

要检查的一件事-您是否真的将 serviceAuthorization 的 principalPermissionMode 设置为“自定义”(如您链接到的文章中所示)?这对你的成功至关重要。

<serviceAuthorization principalPermissionMode="Custom">

另外-可能是您以匿名用户的身份调用您的服务吗?在这种情况下,您可能会得到一个“空”身份。

你的客户端配置是什么样的?你使用什么绑定,什么安全设置?

马克

于 2009-09-03T13:47:25.393 回答