我正在尝试设置一个自定义 IAuthorisationPolicy,我可以将其提供给 ServiceAuthorizationBehaviour 以安装我自己的 IPrincipal 实现。我已经按照 here 说明进行了操作,并编写了一个测试来验证这在使用 NetNamedPipes 绑定(bind)进行自托管时是否有效。
问题是,当我尝试在 IIS 下使用托管时,Identities 属性没有在传递给我的 IAuthorisationPolicy 的评估上下文中设置(而在自托管时是)。
以下是我的配置文件的摘录:
<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];
}
...
}
最佳答案
我正在研究同样的问题。可能是因为您使用了 HTTP。就我而言,IIS 和 TCP 绑定(bind)没问题。当我将其更改为 basicHttpBinding 时,身份停止发送。
关于wcf - 为什么 Identities 属性没有传递给我的自定义 IAuthorisationPolicy?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1373445/