2009-08-05 27 views
0

J'ai hérité d'un projet plutôt compliqué. Le concepteur original a créé un "cookie" qui semble être côté serveur plutôt que client (bien que je puisse me tromper sur cette partie). Il l'utilise pour ce qu'il a appelé "les plus petits privilèges, Single Sign On". Je le code suivant dans tous les services Web proxies il mis en place:Cookies serveur?

[WebServiceBinding(Name = "ISecurityManager", Namespace = "urn:riv:apis:security:forms:ver1")] 
public partial class SecurityManager : SoapHttpClientProtocol, ISecurityManager 
{ 
    public SecurityManager() 
    { 
     //Url = CookieManager.WebServiceUrl(String.Empty, ref CookieContainer); 
     // I’d like to replace the following code with a call like this... 

     CookieContainer = new System.Net.CookieContainer(); 
     string urlSetting = ConfigurationManager.AppSettings["SecurityManager"]; 

     if (urlSetting != null) 
      Url = urlSetting; 
     else 
      Trace.TraceWarning("No URL was found in application configuration file"); 

     string cookieName = FormsAuthentication.FormsCookieName; 
     string cookiePath = FormsAuthentication.FormsCookiePath; 
     string cookieDomain = Properties.Settings.Default.CookieDomain; 
     HttpCookie authCookie = HttpContext.Current.Request.Cookies[cookieName]; 

     if (null != authCookie) 
      CookieContainer.Add(new Uri(urlSetting), new System.Net.Cookie(cookieName, authCookie.Value, cookiePath, cookieDomain)); 
    } 
…. 

J'ai aussi ce code à peu près partout:

string cookieName = FormsAuthentication.FormsCookieName; 
string SecurityContext.ApplicationName = HttpContext.Current.Request.Cookies[cookieName].Path; 
string SecurityContext.UserName = HttpContext.Current.User.Identity.Name; 

if (!string.IsNullOrEmpty(SecurityContext.UserName)) 
…. 

Dans tous les cas, quand il va chercher le authCookie, il revient null ou le SecurityContext.UserName est vide. Je ne suis pas un gourou des cookies et beaucoup de code de ce type est obscurci - et aucune documentation.

Quelqu'un peut-il faire des têtes ou des queues hors de l'intention des blocs de code?

TIA

Répondre

1

FormsAuthentication pour une méthode de service Web? Stocker les informations d'authentification dans un cookie? Il y a tellement de choses qui ne vont pas dans cette histoire. (Note: l'obfuscation lourde de code devrait être prise comme un signe.)

L'intention des blocs de code, comme il apparaît, utilise le cadre de cookie pour l'identification d'utilisateur pendant un appel de méthode. Il suppose que l'utilisateur a déjà été authentifié et que le cookie d'authentification est présent dans toutes les demandes.


EDIT: un peu plus d'informations sur les « cookies côté serveur » - les références que vous voyez à System.Net.Cookie et tels sont les classes .Net Framework pour la gestion des cookies. Les cookies sont des éléments de données côté client qui résident soit en mémoire pour le client (généralement un navigateur Web), soit enregistrés en tant que fichiers texte quelque part sur le système de fichiers local du client. La plupart des applications Web qui définissent des cookies côté client supposent qu'ils traitent avec un navigateur Web, car tous les principaux fournisseurs de navigateur prennent en charge les cookies. Lorsqu'un navigateur Web est utilisé pour faire une demande à une URL, beaucoup d'informations sont envoyées en arrière-plan qui sont cachées à l'utilisateur: l'adresse IP, le type de navigateur et d'OS, etc. Inclus dans cette liste cookies pour ce domaine d'URL donné (il existe des règles HTTP que les navigateurs acceptent). Le code que vous regardez est spécifique à des classes .Net Framework pour gérer ces valeurs de cookies de manière structurée.


La plupart des applications qui consomment des services Web sont complètement apatrides - pas de cookies, pas de sessions, rien. Bien qu'il soit possible qu'un client d'un service Web puisse implémenter le support des cookies, supposer ou exiger le support des cookies pour un service web est une folie. Dans le scénario de code que vous avez débogué pour détecter les valeurs nulles, il est probable que l'application appelante ne prend pas en charge les cookies, ce qui rend le bloc de code entier invalide. C'est cassé par conception.

Je ne trouve pas de moyen sensé d'améliorer ce bloc de code qui n'implique pas de démontage de toute la structure. Compte tenu de votre niveau de familiarité suggéré, passez un peu de temps sur la sécurité Web 101. Familiarisez-vous avec les concepts d'authentification, de sessions (et de cookies).Vous saurez que vous êtes prêt à procéder dès que vous réalisez que la sécurité est quelque chose que vous ne vous inventez pas.

0

Bien évidemment, il est tentant de créer un fournisseur de sécurité/d'autorisation qui ne semble fonctionne pas bien ou pas du tout. Je vous recommande de consulter la bibliothèque d'entreprise pour cette fonctionnalité. Security Application Block QuickStart. Ensuite, regardez la mise en cache du jeton de sécurité.