2011-08-17 32 views
8

Chúng tôi đang trong quá trình phát triển một dịch vụ web WCF REST mà chỉ nhận được một loạt các văn bản tùy ý từ bất kỳ người dùng nặc danh nào và sau đó thực hiện một số xử lý ở mặt sau.WCF REST Service - 401 Unauthorized

Ví dụ, đây là một phương pháp từ dịch vụ web của chúng tôi:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public class MyRESTService : IMyRESTService 
{ 
    [WebInvoke(Method = "PUT", UriTemplate = "/MyRESTMethod?paramA={paramA}&paramB={paramB}")] 
    public Stream MyRESTMethod(string paramA, string paramB, Stream rawData) 
    { 
     //do some stuff... 
    } 
} 

Nếu chúng ta chỉ cần sử dụng các thiết lập mặc định IIS chúng ta có được một (401) Unauthorized. Tuy nhiên, sau nhiều thử nghiệm và sai sót, chúng tôi đã tìm ra rằng chúng tôi có thể làm cho nó hoạt động bằng cách cho phép VIẾT quyền truy cập vào 'Mọi người' trên tệp thực tế .svc cho dịch vụ của chúng tôi.

Câu hỏi của tôi là: tại sao trên thế giới IIS cần phải có quyền truy cập VIẾT vào tệp .svc để làm việc này? Có cách nào tốt hơn hoặc tôi bị mắc kẹt với cách giải quyết này (và có thể không an toàn)?

WTF Microsoft?

Có thể liên quan:

+0

Quyền truy cập của bạn không nhất thiết cần phải được cấp cho "Mọi người". Thay vào đó, người dùng được xác thực phải có các quyền này. Để truy cập nặc danh, đây là IUSR. – chiccodoro

Trả lời

7

Sau khi nói chuyện với một đại diện công nghệ từ M $ tôi đã được thông báo rằng đây thực sự là hành vi mong đợi. Dịch vụ phải có quyền truy cập ghi được kích hoạt để ai đó gửi yêu cầu tới nó và khi bạn thực hiện việc này, nó cũng sẽ tự động đặt quyền ghi ghi trên tệp .SVC.

+0

Bạn đã lưu ngày của tôi! BTW: Suy nghĩ về nó lần thứ hai điều này có ý nghĩa: Khi bạn yêu cầu một PUT trên một tài nguyên, tài nguyên đó phải cho phép truy cập ghi. Bây giờ, tôi đoán REST với WCF có thể được thực hiện như vậy mà IIS diễn giải một PUT /foobar.svc/some/path như một yêu cầu PUT trên /foobar.svc và chuyển tiếp phần "/ some/path" đến WCF để giải thích thêm. Vì vậy, đối với IIS đây là một yêu cầu PUT trên /foobar.svc - trong HTTP nói: Bạn muốn sửa đổi foobar.svc – chiccodoro

9

Tôi cũng đã tìm thấy điều này có thể được sửa chữa bằng cách đặt

<authentication mode="None" /> bên trong <system.web> trong web.config

+0

điều này đã giúp tôi là tốt, nhưng nó có an toàn không? –

+0

Phụ thuộc vào môi trường của bạn. Trong trường hợp của tôi, chúng tôi tin tưởng vào mạng lưới là an toàn, và có thể điều đó là đủ. Nếu bạn cần xác thực trực tiếp giữa các dịch vụ, rõ ràng đây sẽ là một vấn đề. – captncraig