WCF, ASP.NET Membership Provider and Authentication Service

后端 未结 6 1816
长发绾君心
长发绾君心 2020-12-23 18:27

I have written a Silverlight 2 application communicating with a WCF service (BasicHttpBinding). The site hosting the Silverlight content is protected using a ASP.NET Members

6条回答
  •  庸人自扰
    2020-12-23 18:51

    I finally found a way to make this work. For authentication I'm using the "WCF Authentication Service". When authenticating the service will try to set an authentication cookie. I need to get this cookie out of the response, and add it to any other request made to other web services on the same machine. The code to do that looks like this:

    var authService = new AuthService.AuthenticationServiceClient();
    var diveService = new DiveLogService.DiveLogServiceClient();
    
    string cookieHeader = "";
    using (OperationContextScope scope = new OperationContextScope(authService.InnerChannel))
    {
        HttpRequestMessageProperty requestProperty = new HttpRequestMessageProperty();
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestProperty;
        bool isGood = authService.Login("jonas", "jonas", string.Empty, true);
        MessageProperties properties = OperationContext.Current.IncomingMessageProperties;
        HttpResponseMessageProperty responseProperty = (HttpResponseMessageProperty)properties[HttpResponseMessageProperty.Name];
        cookieHeader = responseProperty.Headers[HttpResponseHeader.SetCookie];                
    }
    
    using (OperationContextScope scope = new OperationContextScope(diveService.InnerChannel))
    {
        HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty();
        OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest);
        httpRequest.Headers.Add(HttpRequestHeader.Cookie, cookieHeader);
        var res = diveService.GetDives();
    }      
    

    As you can see I have two service clients, one fo the authentication service, and one for the service I'm actually going to use. The first block will call the Login method, and grab the authentication cookie out of the response. The second block will add the header to the request before calling the "GetDives" service method.

    I'm not happy with this code at all, and I think a better alternative might be to use "Web Reference" in stead of "Service Reference" and use the .NET 2.0 stack instead.

提交回复
热议问题