serviceAuthorization / authorizationPolicies / session
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:
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:
1 2
|
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession ...] |
La vérification des autorisation via le ServiceAuthorizationManager (simplifié):
Code:
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:
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;
}
//...
}
} |