如何在WCF中声明性地实现自定义IAuthorizationPolicy?

时间:2009-08-24 14:13:35

标签: wcf

我有一个托管在IIS中的WCF服务。我想使用自己的IAuthorizationPolicy,并在服务器上的web.config文件中配置它。我有我的身份验证政策:

namespace MyLib.WCF
{
    public class CustomAuthorizationPolicy : IAuthorizationPolicy
    {
        public CustomAuthorizationPolicy()
        {
            this.Id = Guid.NewGuid().ToString();
        }

        public bool Evaluate(EvaluationContext evaluationContext, ref object state)
        {
            throw new ApplicationException("Testing custom auth");
        }
        ...
    }
}

在我的web.config中:

<service behaviorConfiguration="Behavior" name="MyService">
    <endpoint address="" binding="wsHttpBinding"  contract="IMyService"/>               
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
<serviceBehaviors>
    <behavior name="Behavior">
        <serviceAuthorization principalPermissionMode="Custom">
            <authorizationPolicies>
        <add policyType="MyLib.WCF.CustomAuthorizationPolicy, MyLib.WCF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
            </authorizationPolicies>
        </serviceAuthorization>
    </behavior>
</serviceBehaviors>

但我的CustomAuthorizationPolicy.Evaluate()方法永远不会触发。我错过了什么?

1 个答案:

答案 0 :(得分:1)

嗯,明显(愚蠢)的问题是:在你的<service>中,你真的引用了你的行为配置吗?

即。你有:

<system.serviceModel>    
 ....
   <service name="YourService" behaviorConfiguration="Behavior">
       ....
   </service>
 ....
</system.serviceModel>

只是定义你所有的东西都很好但是 - 除非你真的引用它,它对你没有任何好处(去过那里,也是我自己做的!:-))

第二个(几乎是愚蠢的)问题是:你使用什么绑定和安全配置?你有没有打开保安?如果您有<security mode="None">,那么您的服务授权显然也不会被使用(因为根本没有凭据传递给服务)。

马克