2009-12-11 2 views
3

J'ai un service WCF où j'utilise un customUserNamePasswordValidatorType (spécifié dans la section behaviors \ serviceBehaviors \ serviceCredentials \ userNameAuthentication du fichier web.config).Comment stocker des informations sur l'utilisateur authentifié dans WCF?

Ma coutume UserNamePasswordValidator fonctionne de cette façon:

public bool Authenticate(string userName, string password) 
{ 
    If (IsUserValid(username, password)) 
    { 
     UserInfo currentUser = CreateUserInfo(username); 
     // 
     // Here I'd like to store the currentUser object somewhere so that 
     // it can be used during the service method execution 
     // 
     return true; 
    } 
    return false; 

}

Lors de l'exécution d'appel de service, j'ai besoin d'accéder à l'information de l'utilisateur authentifié. Par exemple, je voudrais être en mesure de mettre en œuvre:

public class MyService : IService 
{ 
    public string Service1() 
    { 
     // 
     // Here I'd like to retrieve the currentUser object and use it 
     // 
     return "Hello" + currentUser.Name; 
    } 
} 

Ma question est de savoir comment et où dois-je stocker les informations pendant le processus d'authentification afin qu'il puisse être consulté au cours du processus d'exécution d'appel? Ce stockage ne devrait durer que tant que la "session" est valide. En passant, je n'utilise pas (et ne veux pas utiliser) des sessions sécurisées et/ou des sessions fiables. J'ai donc à la fois establishSecuritytContext et reliableSessions désactivées.

Je pense à activer le mode de compatibilité ASP.NET pour stocker les informations utilisateur dans le HttpContext.Current.Session mais j'ai le sentiment que ce n'est pas comment cela doit être fait.

Répondre

2

Stockez tout ce qui doit être conservé dans un magasin persistant - par ex. une base de données, c'est la meilleure façon de faire.

Stockez les informations utilisateur dans une table utilisateur, par ex. le système d'adhésion ASP.NET ou quelque chose de votre choix. Gardez une sorte de jeton d'identification (nom d'utilisateur, identifiant, etc.) à portée de main pour extraire cette information de la base de données en cas de besoin.

Vous devriez vous efforcer d'avoir un service WCF sans état chaque fois que possible - il ne devrait jamais dépendre d'un "état" d'une autre sorte que ce qui est stocké en toute sécurité dans une base de données.

+0

Ok, mais pendant l'exécution du service, comment vais-je récupérer le nom d'utilisateur de l'utilisateur actuel pour que je puisse le rechercher dans la base de données? – Sylvain

+3

Vous devriez être en mesure de vérifier 'ServiceSecurityContext.Current.PrimaryIdentity' dans chaque appel de service. Cela devrait contenir le IIdentity pour l'utilisateur actuellement authentifié –

+0

Cette identité primaire a une propriété "Name" qui devrait être le nom d'utilisateur de l'utilisateur actuellement authentifié; utilisez cela comme votre "point d'entrée" pour plus d'informations utilisateur dans une table de base de données –

Questions connexes