2009-08-24 28 views
6

Tôi có dịch vụ WCF được định cấu hình để sử dụng xác thực UserName tùy chỉnh thông qua phương thức Validate() được ghi đè của lớp System.IdentityModel.Selectors.UserNamePasswordValidator.WCF UserName xác thực và các hợp đồng lỗi

Tất cả các phương thức của hợp đồng đã được trang trí với FaultContractAttribute để chỉ định lỗi SOAP tùy chỉnh là có thể trả lại.

Khi ném FaultException <T>, trong đó T là loại được chỉ định trong FaultContractAttribute, mọi thứ hoạt động như mong đợi và tôi nhận được lỗi tùy chỉnh trong XML phản hồi.

Tuy nhiên, nếu tôi cố gắng và ném FaultException <T> trong phương pháp overriden Validate() của lớp xác thực username, tôi nhận được một lỗi SOAP chung với lý do sau:

"Các tác giả của lỗi này đã không chỉ định Lý do. "

Tuy nhiên, nếu tôi thay đổi mã để ném lỗi SOAP chung như trong:

throw new FaultException("Authentication failed.");

tôi ít nhất sẽ nhận được "Xác thực không thành." trong yếu tố lý do.

Câu hỏi của tôi là:

  • Tại sao không phải là FaultException <T> trường hợp ngoại lệ đối xử như nhau nếu họ đang ném vào Validate() khi họ nằm trong việc thực hiện dịch vụ?
  • Có thể có ngoại lệ được ném trong phương thức Validate() phù hợp với FaultContractAttribute được chỉ định trên phương thức hợp đồng không?

Bất kỳ trợ giúp nào được đánh giá cao. Đoán của tôi là xác thực xuất hiện trước khi thông báo được liên kết với bất kỳ phương thức nào của hợp đồng, và do đó, không được liên kết với FaultContractAttribute, nhưng bất kỳ bài viết nào xác nhận điều này và đưa ra cách giải quyết sẽ rất hữu ích.

Tali

+0

Cảm ơn bạn đã đăng câu hỏi này. Bất kỳ giải pháp? Tôi vẫn đang tìm kiếm câu trả lời vào tháng 3 năm 2013. –

Trả lời

0

Đó là một chút khó chịu nhưng tôi đã tròn nó bằng cách làm này:

 
SecurityTokenValidationException stve 
    = new SecurityTokenValidationException("Invalid username or password"); 
throw new FaultException<SecurityTokenValidationException>(stve, stve.Message); 

Bao gồm thông điệp bổ sung có nghĩa là bạn không nhận được ngớ ngẩn "không nêu rõ lý do" tin nhắn .

0

Vấn đề là mã xác thực tùy chỉnh đang chạy bên ngoài ngữ cảnh của bất kỳ OperationContract cụ thể nào, do đó không có FaultContract là nơi để WCF xử lý. Vì vậy, câu trả lời ngắn gọn là không, bạn không thể nhận được các ngoại lệ được ném từ trình xác thực tùy chỉnh của mình để tôn vinh số FaultContract.

Bạn có một vài tùy chọn tại đây. Người tôi thích là ném FaultException không chung chung và cung cấp một số tiền được xác định trước FaultCode; theo cách này, các khối catch của tôi có thể phân biệt các lỗi hợp đồng từ các lỗi "hệ thống ống nước". Lưu ý rằng bất kỳ ngoại lệ nào bạn ném từ trình xác thực tùy chỉnh sẽ trở lại dưới dạng MessageSecurityException, như được hiển thị bên dưới:

// Custom Validator: 
public override void Validate(string userName, string password) 
{ 
    throw new FaultException(
    "Invalid username or password.", 
    new FaultCode("AUTHENTICATION_FAILURE")); 
} 

// Client Code: 
try 
{ 
    client.DoSomething(); 
} 
catch (MessageSecurityException ex) 
{ 
    var inner = ex.InnerException as FaultException; 
    if (inner != null && inner.Code.Name.Equals("AUTHENTICATION_FAILURE")) 
    { 
    // Security failure. 
    } 
} 
catch (FaultException<SomethingFault> ex) 
{ 
    // Exception from the method itself. 
} 
+0

Tôi đã thử các đề cập ở trên nhưng tôi nhận được một giá trị null khi tôi cố gắng để đúc ex.innerException như FaultException. Bất kỳ trợ giúp sẽ được đánh giá cao. – vikasse

+0

Vâng, loại ngoại lệ nào là ngoại lệ bên trong? Nếu nó không phải là một lỗi ngoại lệ thì vấn đề của bạn không có trong dịch vụ. –

+0

Tôi ném một loại ngoại lệ lỗi trong máy chủ nhưng trong khách hàng nó nói ngoại lệ bên trong là loại system.net.webexception và tôi không có msg tôi ném từ máy chủ. – vikasse

Các vấn đề liên quan