2009-08-24 61 views
1

我有一个在IIS中托管的WCF服务。我想使用我自己的IAuthorizationPolicy,并在服务器上的web.config文件中配置它。我有我的身份验证策略:如何在WCF中声明性地实现自定义IAuthorizationPolicy?

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

那么,显而易见的(愚蠢的)问题是:在你的<service>,你真的引用你的行为配置?

I.e.你有:

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

只需定义你所有的东西是好的,很好 - 但除非你实际引用它,它不会给你带来任何好(在那里,这样做我自己,太:! - ))

其次(几乎一样愚蠢)的问题是:你使用什么绑定和安全配置?你甚至打开过安全吗?如果你有<security mode="None">,那么你的服务授权显然永远不会被使用,因为根本没有证书被传递给服务。

Marc

+0

伟大的问题,它通常是明显的事情,让我!我已经将我的服务配置添加到上面的代码片段中,但要回答您的问题:1)是的,我引用了我的behaviorConfiguration,2)我使用了wsHttpBinding,但没有安全模式设置 - 也许默认值到无? – MrDustpan 2009-08-24 16:13:20

+0

不,实际上,wsHttp绑定使用Windows凭据默认使用基于消息的安全性。这不应该是问题.... – 2009-08-24 16:58:58

相关问题