如何在WCF中声明性地实现自定义IAuthorizationPolicy?
问题描述:
我有一个在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()方法永远不会触发。我错过了什么?
答
那么,显而易见的(愚蠢的)问题是:在你的<service>
,你真的引用你的行为配置?
I.e.你有:
<system.serviceModel>
....
<service name="YourService" behaviorConfiguration="Behavior">
....
</service>
....
</system.serviceModel>
只需定义你所有的东西是好的,很好 - 但除非你实际引用它,它不会给你带来任何好(在那里,这样做我自己,太:! - ))
其次(几乎一样愚蠢)的问题是:你使用什么绑定和安全配置?你甚至打开过安全吗?如果你有<security mode="None">
,那么你的服务授权显然永远不会被使用,因为根本没有证书被传递给服务。
Marc
伟大的问题,它通常是明显的事情,让我!我已经将我的服务配置添加到上面的代码片段中,但要回答您的问题:1)是的,我引用了我的behaviorConfiguration,2)我使用了wsHttpBinding,但没有安全模式设置 - 也许默认值到无? – MrDustpan 2009-08-24 16:13:20
不,实际上,wsHttp绑定使用Windows凭据默认使用基于消息的安全性。这不应该是问题.... – 2009-08-24 16:58:58