2008-11-10 6 views
6

J'ai récemment écrit un service Web à utiliser avec Silverlight qui utilise l'appartenance et les rôles ASP.net.HttpContext vide lors de l'appel du service Web WCF

Pour valider le client dans le service que je regarde le HTTPContext.Current.User (qui fonctionne lorsque le service est appelé de Silverlight)

Cependant, j'ai essayé d'appeler le service d'un même asp .net postback. Mais quand je suis au service, HTTPContext.Current a une chaîne de caractères pour le nom d'utilisateur.

Je suppose qu'il y a quelque chose que je ne fais pas dans le fichier web.config qui fait que le httpContext n'est pas envoyé via le proxy à mon service?

Toutes les idées seraient appréciées. Je dois être en mesure de valider le client d'une manière ou d'une autre en utilisant l'adhésion et les rôles d'asp.net et de le faire fonctionner à la fois d'un client asp.net et d'un client silverlight.

+0

Est-ce dans le même contexte que le service? Est-ce que vous les forcez à se connecter au site avant d'accéder au service? – Bryant

+0

Ils se connectent sur le site (bien qu'ils puissent naviguer sans se connecter) J'appelle le service pendant une publication. Je peux regarder le HttpContext dans la publication qui est remplie avec l'utilisateur connecté. Mais du côté du service, le HttpContext est vide. – JSmyth

+0

Je ne sais pas exactement ce que vous entendez par le même contexte, le service est hébergé dans un endroit différent de l'application si c'est ce que vous voulez dire. – JSmyth

Répondre

0

Vous ne savez pas comment cela fonctionne à partir de Silverlight mais pas ASP.Net, mais pour les débutants, voici un bon blog post on how to setup WCF to work with ASP.Net membership providers. Il y a pas mal d'étapes donc cela peut être assez facile de manquer un réglage.

Une fois que tout fonctionne correctement, j'imagine que les deux devraient fonctionner correctement.

0

Je pense que c'est peut-être parce que mon service wcf est dans mon projet silverlight.web, et peut-être qu'ils sont plus amicaux quand il s'agit de partager.

J'ai peut-être besoin de lire plus sur wcf et de créer une plus grande séparation des préoccupations en mettant en place un projet de service web séparé?

1

Au lieu de HttpContext essayer ServiceSecurityContext.Current.PrimaryIdentity

+0

ServiceSecurityContext est null - Bien que j'ai Pour le service, peut-être que je dois installer des certificats ou quelque chose? – JSmyth

0

Mise à jour:

Ok j'ai examiné à la demande HTTP Post en utilisant Fiddler

On dirait que l'App Silverlight envoie un ' State 'avec un cookie d'autorisation et mon application asp.net n'est pas.

On dirait que j'ai besoin d'envoyer l'état + mon cookie d'autorisation quand j'appelle le service. Je pourrais devoir formuler une nouvelle question bientôt ...

2

Je l'ai résolu!

Apparemment, l'application Silverlight envoyait par défaut tous les cookies des navigateurs au service. L'un de ces cookies est le cookie ".ASPXAUTH" pour s'authentifier par rapport à l'appartenance et aux rôles.

L'application asp.net n'envoyait cependant pas les cookies au service. Pour envoyer le cookie d'autorisation, j'ai utilisé le code suivant avant d'appeler ma méthode webservice. Pouvez-vous expliquer un peu plus d'où viennent les appels ASP.NET?

using (OperationContextScope scope = new OperationContextScope(ws.InnerChannel)) 
    { 
HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty(); 
OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest); 

      HttpCookieCollection cc = Page.Request.Cookies; 
      if (Request.Cookies[".ASPXAUTH"] != null) 
      { 
       HttpCookie aCookie = Request.Cookies[".ASPXAUTH"]; 
       String authcookieValue = Server.HtmlEncode(aCookie.Value); 
       httpRequest.Headers.Add("Cookie: " + ".ASPXAUTH=" + authcookieValue); 

      } 
// Webservice call goes here 
    }