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 :
Mon service est de type
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>
La vérification des autorisation via le ServiceAuthorizationManager (simplifié):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession ...]
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 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; } ... }
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; } //... } }
Partager