Bonjour,
J'utilise des autorisations accès personnalisés sur des webservices wcf. Pour ce faire j'intercepte les appels de mon web service en utilisant une classe dérivé de "ServiceAuthorizationManager" et une implémentation de "IAuthorizationPolicy".

Mon problème est que je n'arrive pas à stocker des informations de l'utilisateur dans un context par session. Lors de l'entrée dans CheckAccessCore ou Evaluate, je suis obligé de vérifier l'identité et les droits de l'utilisateur en base à chaque appel,
OperationContext.Current.InstanceContext est null
EvaluationContext est réinitialisé à chaque appel
ServiceSecurityContext est réinitialisé à chaque appel

Je n'ai pas trouvé de solutions vraiment pertinente à ce problème, si quelqu'un à une idée...

la configuration suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
<behavior name="customSecurityAccess">
...
<serviceAuthorization serviceAuthorizationManagerType="CustomHabilitationManager, projet">
            <authorizationPolicies>
              <add policyType="CustomPolicy, projet"/>
            </authorizationPolicies>
</serviceAuthorization>
 
</serviceBehaviors>
Mon service est de type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession ...]
La vérification des autorisation via le ServiceAuthorizationManager (simplifié):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
public class CustomHabilitationManager: ServiceAuthorizationManager
    {
 
        protected override bool CheckAccessCore(OperationContext operationContext)
        {
            AuthorizationContext ac = operationContext.ServiceSecurityContext.AuthorizationContext;
 
            //look for our claim
            foreach (ClaimSet claimSet in ac.ClaimSets)
            {
                foreach (Claim clm in claimSet.FindClaims("CustomPolicy", Rights.Identity))
                {
                    //...
                    return true;
                }
            }
            return false;
        }
...
}
et via CustomPolicy (simplifié)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
class UtilisateurPolicy : IAuthorizationPolicy
    {
        #region IAuthorizationPolicy Members
 
        public bool Evaluate(EvaluationContext evaluationContext, ref object state)
        {
            //...
 
            if (UserNameIsGood(out ut))
            {
                List<Claim> claims = new List<Claim>(1);
                Claim utilisateur = new Claim("CustomPolicy", ut , Rights.Identity);
                claims.Add(utilisateur);
                evaluationContext.AddClaimSet(this, new DefaultClaimSet(claims));
		return true;
            }
            //...
        }
 
}