我正在尝试设置一个自定义IAuthorisationPolicy,我可以将其提供给ServiceAuthorizationBehaviour来安装我自己的IPrincipal实现。我按照here的说明进行了编写,并编写了一个测试,用于验证在使用NetNamedPipes绑定进行自托管时这是否有效。
问题是,当我尝试在IIS下托管时,在传递给我的IAuthorisationPolicy的evaluateContext中没有设置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];
}
...
}
答案 0 :(得分:3)
我正在处理同样的问题。可能是因为您使用HTTP。在我的情况下,IIS和TCP绑定是可以的。当我将其更改为basicHttpBinding时,将发送标识。
答案 1 :(得分:1)
要检查一件事 - 您是否真的将serviceAuthorization的principalPermissionMode设置为“Custom”(如您链接的文章中所示)?这对你的成功至关重要。
<serviceAuthorization principalPermissionMode="Custom">
此外 - 您是否可以将您的服务称为匿名用户?在这种情况下,您可能会获得“空”身份。
你的客户端配置是什么样的?你使用什么绑定,什么安全设置?
马克