6

Tôi đã được trên internet cố gắng tìm hiểu lý do tại sao tùy chỉnh AuthorizeAttribute của tôi không hoạt động trong MVC WebApi của tôi. Tôi đã nhìn thấy mọi người hỏi về loại điều trên SO nhưng không đã giúp tôi giải quyết vấn đề của tôi được nêu ra:Tùy chỉnh AuthorizeAttribute Không được gọi bởi MVC Framework

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
       Inherited = false)] 
    public sealed class CustomAuthorization : AuthorizeAttribute 
    { 

     //... 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      // custom auth logic, returns true if authorized, false otherwise 
     } 
    } 

tôi kéo dài từ System.Web.Mvc như trái ngược với System.Web.Http. Tuy nhiên, AuthorizeCore(HttpContextBase httpContext) của tôi không bao giờ được gọi.

Tôi có một constructor trong lớp CustomAuthorization của tôi mà phải mất một params string[] mà là tên của điều khoản tùy chỉnh của tôi cần thiết cho một hành động cụ thể, ví dụ:

[CustomAuthorization("Some Permission")] 
[System.Web.Http.HttpGet] 
public CustomResponse SomeAction() 
{ 
    //... 
} 

Những gì tôi hy vọng sẽ đạt được là phải có phép của tôi mã được kích hoạt bất cứ khi nào một yêu cầu được thực hiện cho một hành động được trang trí với thuộc tính [CustomAuthorization]. Tôi cũng muốn có thể trả lại một thông báo xác thực không thành công hơn nếu ủy quyền không thành công. Không chỉ:

{"Message":"Authorization has been denied for this request."} 

Tôi tin rằng điều này liên quan trọng HandleUnauthorizedRequest nhưng làm thế nào tôi có thể làm điều này để cung cấp cho đối tượng của riêng tôi rằng một phản ứng JSON sẽ serialize?

Để tóm tắt, mã ủy quyền của tôi không bao giờ được gọi bởi khuôn khổ ngay cả khi tôi trang trí các hành động với thuộc tính [CustomAuthorization] của tôi. Nó chỉ đi thẳng để thực thi mã bên trong hành động.

Thứ hai, làm cách nào để tôi có thể triển khai các phản hồi trái phép để tuần tự hóa đối tượng JSON tùy chỉnh?

Cảm ơn sự giúp đỡ của bạn trước, nó được nhiều người đánh giá cao!

+0

Dựa vào nhận xét của tôi về cách tôi đã triển khai thuộc tính ủy quyền tùy chỉnh ... Để bắt đầu, tôi nghĩ bạn muốn ghi đè OnAuthorization, chứ không phải AuthorizeCore. Ngoài ra, tôi không chắc bạn cần phải có lớp học của bạn kín. –

Trả lời

6

Ok tôi cuối cùng giải quyết nó và đây là cách:

public override void OnAuthorization(HttpActionContext actionContext) { 

    .... 

    if (!authorized) { 

     actionContext.Response =  
        actionContext.Request.CreateResponse(
            HttpStatusCode.Unauthorized, 
            new Dictionary<string, string> { 
               { "hello", "world" } 
            } 
       ); 

    } 

}

nào tạo ra kết quả:

{"hello":"world"} 

Đối tượng điển là tùy ý, nó chỉ cho thấy rằng một loại sẽ được sắp xếp theo thứ tự để phản hồi thành công.

Nếu bạn không đặt actionContext.Response thì Yêu cầu sẽ tiếp tục hành động mục tiêu - ví dụ: nó được coi là được ủy quyền bởi bộ lọc này.

Hy vọng rằng sẽ giúp những người khác ở vị trí này.

+0

cũng được thực hiện ...... –

+0

Đó là một cứu trợ để tìm giải pháp rất đơn giản! Cảm ơn những nỗ lực của bạn, nhiều đánh giá cao. Vui mừng tất cả các công trình ngay bây giờ! – ComethTheNerd

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