5

Ngữ nghĩa dự định cho nhiều bộ lọc xác thực là gì? Điều đó được cho phép? và nếu có, làm thế nào để họ làm việc cùng nhau?Bộ điều khiển ASP.net Web API 2 với nhiều bộ lọc xác thực

Dưới đây là ví dụ cụ thể. Giả sử tôi có một lớp điều khiển như

[BasicAuthenticator] 
[LocalAuthenticator] 
[Authorize] 
public class TestController : ApiController 
{ 
    [AllowAnonymous] 
    public IHttpActionResult GetProduct(int id) 
    { 
    } 

    // etc. etc 
} 

trong đó BasicAuthenticator và LocalAuthenticator thực hiện IAuthenticationFilter.

Mỗi trình xác thực sẽ có cơ hội thành công. Nếu một trong hai thành công, nó sẽ đặt context.Principal thành một đối tượng mới với ClaimsIdentity thích hợp (tên, loại và isAuthenticated = true).

Điều gì sẽ xảy ra nếu trình xác thực không thành công? Tôi nghĩ nó không nên làm gì cả, để người khác sẽ có cơ hội thành công. Đúng?

Và điều gì sẽ xảy ra nếu cả hai thành công? Có bất kỳ điều gì xảy ra lần thứ hai để xóa Hiệu trưởng do người đầu tiên tạo ra không? Nó sẽ không có ý nghĩa hơn để hợp nhất các bộ sưu tập ClaimsIdentity của hai đối tượng chính với nhau?

Nếu trình xác thực không thành công, bạn không nên làm gì, đúng không? Bởi vì người xác thực khác có thể thành công. Ngữ nghĩa của việc có hai người xác thực là hành động sẽ chạy nếu một trong hai thành công, đúng không?

Tôi nghĩ rằng lớp ủy quyền sẽ xem xét tất cả các ClaimsIdentity trong hiệu trưởng, và nếu bất kỳ ClaimsIdentity có "isAuthenticated = true" thì nó sẽ cho phép hành động điều khiển chạy. Nếu không, nó sẽ thiết lập trạng thái = 401. Điều đó có vẻ là cách nó hoạt động. Điều đó đúng không?

Mục đích của [AllowAnonymous] là tắt tất cả các bộ lọc ủy quyền khác, đúng không? Bộ điều khiển (hoặc phương thức hành động) được trang trí với [AllowAnonymous] sau đó tôi giả sử rằng nó sẽ luôn chạy, ngay cả khi việc xác thực thất bại. Đúng không?

Trả lời

-2

Bộ lọc xác thực cuối cùng để chạy thành công chỉ đơn giản là ghi đè Hiệu trưởng. Khi bạn nhìn vào đối tượng chính và các bộ sưu tập yêu cầu phức tạp phức tạp gắn liền với nó, bạn sẽ nghĩ rằng tất cả sự phức tạp này chắc chắn là nhằm hỗ trợ nhiều xác thực thành công! Nhưng bạn đã sai. Chỉ có một người có thể thành công. Không có lý do gì cho sự phức tạp, ngoài việc thưởng thức bàn trang điểm của một số kiến ​​trúc sư tại Microsoft.

+0

Mô hình xác thực giống như "một danh tính cho mỗi phương thức xác thực". ClaimsPrincipal có thể được sử dụng để truy vấn nhiều cá thể ClaimsIdentity cơ bản của nó. Bạn đã thử từng bộ lọc của mình chỉ cần thêm một nhận dạng mới cho hiệu trưởng hiện tại, thay vì xây dựng một hiệu trưởng mới? – tuespetre

2

Với bộ lọc xác thực gần đây giới thiệu trong Web API 2, tôi đoán một là nghĩa vụ phải giới thiệu một thuộc tính để xác thực, và có thể một thuộc tính cho phép, như MS đội chia hai mối quan tâm. Vì vậy, ngữ nghĩa là có một để xác thực.

Dường như với tôi rằng thực tế bạn có thể thêm nhiều hơn một thuộc tính xác thực chỉ là một trùng hợp ngẫu nhiên, bởi vì bạn xảy ra để thiết lập bộ lọc trên điều khiển và hành động của họ bằng các phương tiện của các thuộc tính, và như bạn có thể thêm hơn một thuộc tính ... Tương tự, với tất cả các hành động của tất cả các bộ điều khiển: vì có thể thêm nhiều hơn một bộ lọc, nó không nhất thiết ngụ ý rằng nên thêm nhiều bộ lọc xác thực.

Nếu bạn cần hỗ trợ nhiều cơ chế xác thực (ví dụ:a BasicLocal), bạn chỉ có thể có một thuộc tính/bộ lọc duy nhất chặn yêu cầu và sẽ thử cả hai cơ chế, triển khai bất kỳ logic tùy chỉnh nào và bạn có thể cần.

+1

Điều đó không đúng. Đọc blog này từ MS, http://www.asp.net/web-api/overview/security/authentication-filters Đặc biệt là nơi nó nói "Nếu ... bộ lọc không nhận ra lược đồ xác thực, không làm gì và trả lại (no-op). Một bộ lọc khác trong đường ống có thể hiểu sơ đồ. " Điều này ngụ ý rằng có thể có nhiều bộ lọc xác thực. –

+0

Bạn nói đúng về điều đó. Tôi nghĩ rằng tôi đã không thể hiện bản thân mình một cách tốt nhất. Điểm là người ta có thể có nhiều thuộc tính/bộ lọc, nhưng logic kết hợp chúng không thể được tùy chỉnh. Thay vào đó nó bằng cách nào đó * áp đặt * từ phía trên: nếu xác thực được truyền, danh tính (hoặc cái gì khác) được thiết lập và nó chuyển sang bộ lọc/thuộc tính tiếp theo. Nếu nó không thành công, về cơ bản tất cả các bước sau trong chuỗi nên được bỏ qua. Vì vậy, nếu sau đây là một lần nữa xác thực, nó là cơ bản vô dụng: hoặc sẽ tìm thấy danh tính đã được thiết lập, hoặc nó thậm chí có thể không được gọi. – superjos

+0

* CHỈNH SỬA * Tôi không thể tìm thấy trước bit mà nó nói cụ thể cách chuỗi các bộ lọc xác thực được cho là hoạt động. Đó là trong phần * Triển khai AuthenticateAsync *. Đó là logic chaining ra khỏi hộp. – superjos

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