私は独自のIPrincipal実装をインストールするためにServiceAuthorizationBehaviourに与えることができるカスタムIAuthorisationPolicyを設定しようとしています。私は指示hereに従い、NetNamedPipesバインディングを使って自己ホストするときにこれが動作することを確認するテストを書いた。アイデンティティプロパティがカスタムIAuthorisationPolicyに渡されないのはなぜですか?
問題は、IISでホストされているものを使用しようとすると、Identitiesプロパティが自分のIAuthorisationPolicyに渡されるevaluationContextに設定されていないことです(自己ホスティングの場合と異なります)。
次は私の構成ファイルからの抜粋です:
<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を構成してることに注意してください)
任意のアイデア理由私はアイデンティティのプロパティを渡されていないよ?
マイ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];
}
...
}
Marc私は間違いなくカスタムに設定していますが、匿名ユーザーの頭に釘を打つかもしれないと思います。私はこの動作をすべてのサービスに適用していましたが、一部は匿名です。 –