2008-11-10 34 views
6

Gần đây tôi đã viết một dịch vụ web được sử dụng với Silverlight sử dụng tư cách thành viên và vai trò ASP.net.Empty HttpContext khi gọi WCF webservice

Để xác nhận khách hàng trong dịch vụ tôi nhìn vào HTTPContext.Current.User (Những công trình khi dịch vụ được gọi là từ Silverlight)

Tuy nhiên, tôi đã cố gắng để gọi các dịch vụ tương tự từ một asp .net postback. Nhưng khi tôi bước qua dịch vụ, HTTPContext.Current có một chuỗi emplty cho tên người dùng.

Tôi đoán có điều gì đó mà tôi không làm trong tệp web.config đang khiến httpContext không được gửi qua proxy tới dịch vụ của tôi?

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao. Tôi cần để có thể xác nhận khách hàng bằng cách nào đó bằng cách sử dụng thành viên asp.net và vai trò và có nó làm việc từ cả một khách hàng asp.net và một khách hàng silverlight.

+0

Bạn có thể giải thích thêm một chút về nơi cuộc gọi ASP.NET đến từ đâu không? Có phải trong bối cảnh giống như dịch vụ? Bạn có buộc họ phải đăng nhập vào trang web trước khi truy cập dịch vụ không? – Bryant

+0

Họ đăng nhập trên trang web (mặc dù họ có thể duyệt mà không cần đăng nhập) Tôi gọi dịch vụ trong khi đăng lại. Tôi có thể nhìn vào HttpContext trong postback được điền với người dùng đã đăng nhập. Nhưng về phía dịch vụ, HttpContext rỗng. – JSmyth

+0

Tôi không biết chính xác bạn ngụ ý gì trong bối cảnh đó, dịch vụ đang được lưu trữ ở một nơi khác với ứng dụng nếu đó là ý của bạn. – JSmyth

Trả lời

0

Bạn không chắc chắn cách thức hoạt động của Silverlight chứ không phải ASP.Net, nhưng đối với người mới bắt đầu ở đây là một số tốt blog post on how to setup WCF to work with ASP.Net membership providers. Có một vài bước để điều này có thể khá dễ dàng để bỏ lỡ một thiết lập.

Một khi bạn nhận được rằng làm việc một cách chính xác sau đó tôi tưởng tượng cả hai nên hoạt động chính xác.

0

Tôi nghĩ có thể là do dịch vụ wcf của tôi nằm trong dự án silverlight.web của tôi và có lẽ họ thân thiện hơn khi chia sẻ.

Tôi có thể cần phải đọc thêm về wcf và tạo sự phân tách mối quan tâm lớn hơn bằng cách thiết lập dự án webservice riêng biệt?

1

Thay vì HttpContext thử ServiceSecurityContext.Current.PrimaryIdentity

+0

ServiceSecurityContext is null - Mặc dù tôi có Đối với dịch vụ, có lẽ tôi phải thiết lập chứng chỉ hay gì đó? – JSmyth

0

Cập nhật:

Ok Tôi đã lấy một cái nhìn tại các yêu cầu HTTP bài viết sử dụng Fiddler

Hình như App Silverlight đang gửi một ' Nhà nước 'với một cookie ủy quyền và ứng dụng asp.net của tôi là không.

Có vẻ như tôi cần gửi trạng thái + cookie ủy quyền của mình khi tôi gọi dịch vụ. Tôi có thể cần sớm xây dựng câu hỏi mới ...

2

Tôi đã giải quyết nó!

Dường như theo mặc định, ứng dụng Silverlight đang gửi tất cả cookie của trình duyệt đến dịch vụ. Một trong những cookie này là cookie ".ASPXAUTH" để xác thực với tư cách thành viên và vai trò.

Tuy nhiên, ứng dụng asp.net không gửi cookie đến dịch vụ. Để gửi cookie ủy quyền, tôi đã sử dụng mã sau đây trước khi gọi phương thức webservice của tôi.

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 
    } 
Các vấn đề liên quan