2014-10-13 23 views
9

Chúng tôi đang sử dụng lớp OAuthAuthorizationServerProvider để thực hiện ủy quyền trong ứng dụng ASP.NET Web Api của chúng tôi.Cách tùy chỉnh thông báo lỗi của OAuthAuthorizationServerProvider?

Nếu tên người dùng và mật khẩu được cung cấp là không hợp lệ trong GrantResourceOwnerCredentials, cuộc gọi

context.SetError("invalid_grant", "The user name or password is incorrect."); 

Tạo kết quả Json sau:

{ 
    "error": "invalid_grant", 
    "error_description": "The user name or password is incorrect." 
} 

Có cách nào để tùy chỉnh kết quả lỗi này?
Tôi muốn làm cho nó phù hợp với định dạng thông báo lỗi mặc định được sử dụng trong các bộ phận khác của API:

{ 
    "message": "Some error occurred." 
} 

Đây có phải là có thể đạt được với OAuthAuthorizationServerProvider?

+1

Trong khi các câu trả lời dưới đây chứng minh làm thế nào để làm được điều này, tôi sẽ thận trọng đối với việc này, như phản ứng mặc định trở lại phù hợp với những đặc điểm kỹ thuật OAuth 2.0, trong khi phản ứng biến đổi của bạn sẽ không . Điều này có thể chấp nhận được đối với các API chỉ dành cho nội bộ. Tuy nhiên, nếu API này có thể truy cập công khai, bạn có thể muốn tuân theo đặc điểm kỹ thuật và không phát minh ra các quy ước mới. – Chris

+0

Tôi thấy rằng những câu trả lời này không hoạt động và có vẻ như phản hồi OAuth trông giống một phản hồi API Web chuẩn không dễ như người ta nghĩ. – Sam

Trả lời

7

Đây là cách tôi đã làm.

string jsonString = "{\"message\": \"Some error occurred.\"}"; 

// This is just a work around to overcome an unknown internal bug. 
// In future releases of Owin, you may remove this. 
context.SetError(new string(' ',jsonString.Length-12)); 

context.Response.StatusCode = 400; 
context.Response.Write(jsonString); 
+1

Như một lưu ý, tôi đã thử tạo một lớp OwinMiddleware để ghi đè lên ngữ cảnh.Response.Body, nhưng điều đó không có tác dụng nếu có ai cố gắng. Điều này làm việc hoàn hảo. – DDiVita

+1

Điều này đã không làm việc cho tôi trên api web 2. Phản ứng không phải là json thích hợp, vì lỗi nội bộ mà bạn đã đề cập. – Sam

5

+1 cho câu trả lời của Dasun. Đây là cách tôi mở rộng thêm một chút.

public class ErrorMessage 
{ 
    public ErrorMessage(string message) 
    { 
     Message = message; 
    } 

    public string Message { get; private set; } 
} 

public static class ContextHelper 
{ 
    public static void SetCustomError(this OAuthGrantResourceOwnerCredentialsContext context, string errorMessage) 
    { 
     var json = new ErrorMessage(errorMessage).ToJsonString(); 

     context.SetError(json); 
     context.Response.Write(json); 
    } 
} 

. ToJsonString() là một phương pháp mở rộng khác sử dụng thư viện Newtonsoft.Json.

public static string ToJsonString(this object obj) 
    { 
     return JsonConvert.SerializeObject(obj); 
    } 

Cách sử dụng:

context.SetCustomError("something went wrong"); 
+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn! – vincentw56

+1

Điều này không làm việc cho tôi với phiên bản mới nhất của api web 2. – Sam

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