Ich versuche, eine benutzerdefinierte IAuthorisationPolicy einzurichten, die ich ServiceAuthorizationBehaviour geben kann, um meine eigene IPrincipal Implementierung zu installieren. Ich habe die Anweisungen befolgt aquí und einen Test geschrieben, der verifiziert, dass dies beim Selbsthosten mit einer NetNamedPipes-Bindung funktioniert.
Das Problem ist, wenn ich versuche, diese unter IIS gehostet verwenden die Identities-Eigenschaft wird nicht in der evaluationContext festgelegt, die an meine IAuthorisationPolicy übergeben wird (während es ist, wenn selbst gehostet).
Das Folgende ist ein Auszug aus meiner Konfigurationsdatei:
<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>
(Beachten Sie, dass ich das ServiceAuthorisationBehavior durch Code konfiguriere, weshalb es hier nicht erscheint)
Haben Sie eine Idee, warum mir die Eigenschaft Identities nicht übergeben wird?
Meine IAuthorisationPolicy sieht wie folgt aus:
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];
}
...
}