2008-11-10 6 views
6

Ich schrieb vor kurzem einen Webservice für die Verwendung mit Silverlight, die die ASP.net Mitgliedschaft und Rollen verwendet.Empty HttpContext beim Aufruf WCF Webservice

Um den Client im Service, den ich am HttpContext.Current.User aussehen zu bestätigen (was funktioniert, wenn der Dienst von Silverlight genannt wird)

Aber ich habe versucht, den gleichen Service von einem asp zu nennen .net Postback. Aber wenn ich den Dienst betrete, hat der HTTPContext.Current einen emplty String für den Benutzernamen.

Ich vermute, es gibt etwas, was ich nicht in der Datei web.config tun, die verursacht, dass der httpContext nicht über den Proxy an meinen Dienst gesendet wird?

Irgendwelche Ideen würden geschätzt. Ich muss in der Lage sein, den Klienten irgendwie zu validieren, asp.net Mitgliedschaft und Rollen zu benutzen und es von einem asp.net Klienten und einem silverlight Klienten arbeiten zu lassen.

+0

Können Sie ein wenig mehr darüber erklären, woher die ASP.NET-Anrufe kommen? Liegt es im selben Kontext wie der Dienst? Fordern Sie sie dazu auf, sich auf der Website anzumelden, bevor sie den Dienst nutzen? – Bryant

+0

Sie melden sich auf der Website an (obwohl sie durchsuchen können, ohne sich anzumelden). Ich rufe den Dienst während eines Postbacks an. Ich kann den HttpContext im Postback ansehen, der mit dem eingeloggten Benutzer gefüllt ist. Aber auf der Serviceseite ist der HttpContext leer. – JSmyth

+0

Ich weiß nicht genau, was Sie mit dem gleichen Kontext meinen, der Dienst wird an einem anderen Ort als die Anwendung gehostet, wenn Sie das meinen. – JSmyth

Antwort

0

Ich denke es kann sein, weil mein WCF-Dienst in meinem silverlight.web-Projekt ist, und vielleicht sind sie freundlicher, wenn es um das Teilen geht.

Ich muss vielleicht mehr über wcf nachlesen und eine größere Trennung von Bedenken schaffen, indem ich ein separates Webservice-Projekt einrichte?

1

Statt Httpcontext ServiceSecurityContext.Current.PrimaryIdentity versuchen

+0

ServiceSecurityContext ist null - Obwohl ich habe Für den Service, muss ich vielleicht Zertifikate oder etwas einrichten? – JSmyth

0

Update:

Ok ich einen Blick auf die HTTP POST-Anforderung genommen haben mit Fiddler

Sieht aus wie die Silverlight-App sendet eine ' State 'mit einem Autorisierungs-Cookie und meine asp.net App ist nicht.

Sieht so aus, als müsste ich den Status + mein Autorisierungs-Cookie senden, wenn ich den Dienst anrufe. Ich muss vielleicht bald eine neue Frage formulieren ...

2

Ich habe es gelöst!

Sieht so aus, als ob die Silverlight-Anwendung standardmäßig alle Browser-Cookies an den Dienst sendet. Einer dieser Cookies ist der ".ASPXAUTH" -Cookie, um sich gegen die Mitgliedschaft und die Rollen zu authentifizieren.

Die asp.net-Anwendung schickte jedoch die Cookies nicht an den Dienst. Um das Autorisierungs-Cookie zu senden, habe ich vor dem Aufruf meiner Webservice-Methode folgenden Code verwendet.

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 
    }